为什么posexplode失败并出现"AnalysisException:AS子句中提供的别名数与列数不匹配......"?

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"为给定数组或映射列中具有位置的每个元素创建一个新行."

vak*_*vak 7

事情很清楚,如果你会使用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)


Sha*_*ala 6

您可以使用posexplode如下select

dataframe.select($"value", posexplode($"value")).show(false)
Run Code Online (Sandbox Code Playgroud)

返回两个新列为poscol

希望这可以帮助!

  • 答案使用“select”(而不是“withColumn”)。 (3认同)