spark posexplode在列中失败

时间:2019-02-22 13:52:43

标签: apache-spark apache-spark-sql

如何在sparks withColumn语句中使用posexplode?

Seq(Array(1,2,3)).toDF.select(col("*"), posexplode(col("value")) as Seq("position", "value")).show

工作正常,而:

Seq(Array(1,2,3)).toDF.withColumn("foo", posexplode(col("value"))).show

失败:

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 foo ;

3 个答案:

答案 0 :(得分:2)

不确定这是否真的是您想要的,但是您可以尝试选择语句而不是withColumn,例如

df.select('col1', 'col2', F.posexplode('col_to_be_exploded'))

答案 1 :(得分:0)

withColumn 函数似乎不适用于 posexplode。你可以使用这样的东西:

df.select($"*", posexplode($"value").as(List("index", "column")))

答案 2 :(得分:0)

您可以不使用 withColumn(),而是选择数据框中的所有列并附加 posexplode() 的结果,包括 poscol 字段的别名。这是一个使用 PySpark 的示例。

from pyspark.sql import functions as F
from pyspark.sql import SparkSession

spark = SparkSession.builder.master("local[*]").getOrCreate()

df = spark.createDataFrame(
    [(["a"], ), (["b", "c"], ), (["d", "e", "f"], )],
    ["A"],
)

df.show()
# +---------+
# |        A|
# +---------+
# |      [a]|
# |   [b, c]|
# |[d, e, f]|
# +---------+

df = df.select("*", F.posexplode("A").alias("B", "C"))
df.show()
# +---------+---+---+
# |        A|  B|  C|
# +---------+---+---+
# |      [a]|  0|  a|
# |   [b, c]|  0|  b|
# |   [b, c]|  1|  c|
# |[d, e, f]|  0|  d|
# |[d, e, f]|  1|  e|
# |[d, e, f]|  2|  f|
# +---------+---+---+