scala - 将 JSON 键/值对列表拆分为数据集中一行的列

标签 scala apache-spark apache-spark-sql

我有一列包含键/值对象列表:

+----+--------------------------------------------------------------------------------------------+
|ID  | Settings                                                                                   |
+----+--------------------------------------------------------------------------------------------+
|1   | [{"key":"key1","value":"val1"}, {"key":"key2","value":"val2"}, {"key":"key3","value":"val3"}] |
+----+--------------------------------------------------------------------------------------------+

是否可以将此对象列表拆分为自己的行? 因此:

+----+------+-------+-------+
|ID  | key1 | key2  |  key3 |
+----+------+-------+-------+
|1   | val1 | val2  |  val3 |
+----+------+-------+-------+

我尝试过爆炸并放入结构中:

   case class Setting(key: String, value: String)
   val newDF = df.withColumn("setting", explode($"settings"))
                .select($"id", from_json($"setting" Encoders.product[Setting].schema) as 'settings)

这给了我:

+------+------------------------------+
|ID    |settings                      |
+------+------------------------------+
|1     |[key1,val1]                   |
|1     |[key2,val2]                   |
|1     |[key3,val3]                   |
+------+------------------------------+

从这里我可以使用这样的settings.key指定的行 但这并不完全是我所需要的。我需要访问一行数据中的多个键

最佳答案

如果你已经得到了这个,你就快到了

+------+------------------------------+
|ID    |settings                      |
+------+------------------------------+
|1     |[key1,val1]                   |
|1     |[key2,val2]                   |
|1     |[key3,val3]                   |
+------+------------------------------+

现在您可以使用数据透视表将数据 reshape 为

newDF.groupBy($"ID")
  .pivot("settings.key")
  .agg(first("settings.value"))

按 ID 分组并使用pivot,使用agg获取first值,但您可以使用任何其他函数此处。

输出:

+---+----+----+----+
|ID |key1|key2|key3|
+---+----+----+----+
|1  |val1|val2|val3|
+---+----+----+----+

希望这有帮助!

关于scala - 将 JSON 键/值对列表拆分为数据集中一行的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49854555/

相关文章:

Scala修改嵌套列的值

java - 使用 Java Play Framework 2.3.x 在 Controller 中上传单元测试文件

Scala:部分评估函数并缓存固定值

scala - 什么是同构和同态

scala - 计算 ALS 模型中的 RMSE

apache-spark - 如何在Spark2.4中读取spark2-shell中的Avro文件?

python - 如何序列化 PySpark GroupedData 对象?

scala - Spark Build Custom Column Function,用户定义函数

scala - 无法在 Play for Scala 中发送到浏览器 ByteArrayOutputStream

apache-spark - Spark 流检查点恢复非常非常慢