我有一个 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)
是否可以只选择
a, c
在 v
来自 df
没有做 map
?特别是df
从 Parquet 文件加载,我不想要 c
的值甚至可以加载/阅读。
最佳答案
这完全取决于您期望作为输出的内容,这从您的问题中不清楚。让我澄清一下。
你可以做
df.select($"v.a",$"v.b").show()
然而,结果可能不是你想要的,因为
v
是一个数组,它将为 a 生成一个数组,每个 b 生成一个数组。您可能想要做的是 explode
然后数组 v 从分解的数据框中选择:df.select(explode($"v").as("v" :: Nil )).select($"v.a", $"v.b").show()
这会将 v 展平到一个表格,其所有值都展平。
在任何一种情况下,spark/parquet 都应该足够聪明,可以使用谓词下推而不加载 c。
关于apache-spark - 从结构数组中选择 Spark DataFrames 中的特定列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37172254/