gpt4 book ai didi

scala - 数据框上的平面图

转载 作者:行者123 更新时间:2023-12-04 03:12:26 25 4
gpt4 key购买 nike

什么是预成型的最佳方法 flatMapDataFrame在 Spark ?
通过四处搜索并进行一些测试,我提出了两种不同的方法。这两个都有一些缺点,所以我认为应该有一些更好/更简单的方法来做到这一点。

我发现的第一种方法是先转换 DataFrameRDD然后再回来:

val map = Map("a" -> List("c","d","e"), "b" -> List("f","g","h"))
val df = List(("a", 1.0), ("b", 2.0)).toDF("x", "y")

val rdd = df.rdd.flatMap{ row =>
val x = row.getAs[String]("x")
val x = row.getAs[Double]("y")
for(v <- map(x)) yield Row(v,y)
}
val df2 = spark.createDataFrame(rdd, df.schema)

第二种方法是创建一个 DataSet使用前 flatMap (使用与上面相同的变量)然后转换回来:
val ds = df.as[(String, Double)].flatMap{
case (x, y) => for(v <- map(x)) yield (v,y)
}.toDF("x", "y")

当列数很少时,这两种方法都可以很好地工作,但是我有超过 2 列。有没有更好的方法来解决这个问题?最好采用不需要转换的方式。

最佳答案

您可以创建第二个 dataframe来自您的 map RDD:

val mapDF = Map("a" -> List("c","d","e"), "b" -> List("f","g","h")).toList.toDF("key", "value")

然后做 join并申请 explode功能:
val joinedDF = df.join(mapDF, df("x") === mapDF("key"), "inner")
.select("value", "y")
.withColumn("value", explode($"value"))

你得到了解决方案。
joinedDF.show()

关于scala - 数据框上的平面图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43995063/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com