从Array of Struct中选择Spark DataFrames中的特定列

时间:2016-05-11 20:02:15

标签: apache-spark spark-dataframe parquet

我有一个带有以下架构的Spark DataFrame df

root
 |-- k: integer (nullable = false)
 |-- v: array (nullable = true)
 |    |-- element: struct (containsNull = true)
 |    |    |-- a: integer (nullable = false)
 |    |    |-- b: double (nullable = false)
 |    |    |-- c: string (nullable = true)

是否可以从[{1}} a, c中选择v而不执行df?特别是,map从Parquet文件加载,我不希望加载/读取df的值。

1 个答案:

答案 0 :(得分:1)

这完全取决于您对输出的期望,这在您的问题中并不明确。让我澄清一下。 你可以做到

df.select($"v.a",$"v.b").show()

然而,结果可能不是你想要的,因为v是一个数组,它将产生a和a的数组。您可能想要做的是explode数组v然后从分解的数据框中选择:

df.select(explode($"v").as("v" :: Nil )).select($"v.a", $"v.b").show()

这会将v展平为一个表格,其所有值都会变平。 在任何一种情况下,spark / parquet 足够聪明,以便使用谓词下推而不加载c。