我有一个带有以下架构的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
的值。
答案 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。