Pi *_* Pi 5 apache-spark apache-spark-sql spark-dataframe
这是我的数据帧:
+------------------------------------------
|value
+------------------------------------------
|[0.0, 1.0, 0.0, 7.0000000000000036, 0.0]
|[2.0000000000000036, 0.0, 2.9999999999999996, 4.0000000000000036, 5.000000000000002]
|[4.000000000000006, 0.0, 0.0, 6.000000000000006, 7.000000000000004]
+------------------------------------------
Run Code Online (Sandbox Code Playgroud)
我用的时候:
dataFrame.withColumn("item_id", posexplode(dataFrame.col("value")))
Run Code Online (Sandbox Code Playgroud)
我收到了这个错误:
org.apache.spark.sql.AnalysisException: The number of aliases supplied in the AS clause does not match the number of columns output by the UDTF expected 2 aliases but got item_id ;
Run Code Online (Sandbox Code Playgroud)
那么,如何使用posexplode"为给定数组或映射列中具有位置的每个元素创建一个新行."
事情很清楚,如果你会使用explode在.withColumn().
相比之下,前低优先级的火花20174被接受和执行,使用posexplode沿着withColumn不是直线前进.您可能希望使用基于的解决方法selectExpr,如下所示.
val df = Seq(
("a", Seq(1,2,3)),
("b", Seq(11,22))).toDF("n", "s")
df show
+---+---------+
| n| s|
+---+---------+
| a|[1, 2, 3]|
| b| [11, 22]|
+---+---------+
Run Code Online (Sandbox Code Playgroud)
df selectExpr("*", "posexplode(s) as (p,c)") drop("s") show
+---+---+---+
| n| p| c|
+---+---+---+
| a| 0| 1|
| a| 1| 2|
| a| 2| 3|
| b| 0| 11|
| b| 1| 22|
+---+---+---+
Run Code Online (Sandbox Code Playgroud)
您可以使用posexplode如下select
dataframe.select($"value", posexplode($"value")).show(false)
Run Code Online (Sandbox Code Playgroud)
返回两个新列为pos和col
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
4534 次 |
| 最近记录: |