apache-spark - 从结构数组中选择 Spark DataFrames 中的特定列

标签 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)

是否可以只选择 a, cv来自 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/

相关文章:

apache-spark - 如何向 Delta Lake 表添加新列?

json - 如何在 Spark 2 中解压 LZ4 JSON

python - 使用 CLI 与同一环境中的可执行文件从 parquet 读取 DataFrame 时的不同行为

hadoop - 插入 Parquet 文件生成 512 MB 文件。如何生成 1 GB 的文件?

apache-spark - 在PySpark中用空数组过滤行

parquet - Apache 的 Parquet Java API 的文档?

scala - 如何在 Spark 中将 parquet 文件拆分为多个分区?

hadoop - 将 Spark 设置为 Hive 的默认执行引擎

hadoop - 将更新的jar文件复制到Spark上的每个从属节点

scala - UDF vs Spark sql vs 列表达式性能优化