apache-spark - Spark PySpark 以一列值作为键输出 JSON
问题描述
如果我在带有架构的数据框中有一个简单的表:
a string, b string, c string
例如:
a b c
cat 3-3 78-b
cat 3-3 89-0
cat 4-4 78-n
dog 4-4 89-b
等等。我想按 a 列对这个表进行分区,并将每个分区保存为单独的 JSON。
此外,我希望每个分区作为一个 JSON 文件,其中 b 列中的值作为键。例如:
File cat.json:
{
"3-3": {"b": "3-3", "c": "78-b"},
"3-3": {"b": "3-3", "c": "89-0"},
"4-4": {"b": "4-4", "c": "78-n"}
}
File dog.json:
{
"4-4": {"b": 4-4, "c": "89-b"}
}
有没有办法在 pyspark 中做到这一点?谢谢
解决方案
只需为Dataframe添加一个行映射逻辑就可以了,请找到内联的代码说明
import org.apache.spark.sql.Row
import org.apache.spark.sql.functions._
object CatDog {
def main(args: Array[String]): Unit = {
val spark = Constant.getSparkSess
import spark.implicits._
val df = List(("cat", "3-3" ,"78-b"),
("cat" ,"3-3", "89-0"),
("cat" ,"4-4" ,"78-n"),
("dog" ,"4-4", "89-b")).toDF("a","b","c")
// df.show()
//Write your out as JSON
df.select("a").distinct().map((a: Row) =>
(a, df.filter(col("a") === a).map(row => parseDF(row)))
).foreachPartition((iterator) => {
iterator.foreach(record => {
val aVal = record._1.getString(0)
record._2.write.json(s"src/main/resources/$aVal.json")
})
})
}
//Row mapping logic
def parseDF(row: Row): Map[String, Map[String, String]] = {
val b = row.getString(1)
val c = row.getString(2)
Map(b -> Map("b" -> b, "c" -> c))
}
}
推荐阅读
- python - 在文件中输入列表项
- iphone - Spring Redirect 在 iOS 上不起作用(从桌面上很好)
- caching - TYPO3 9.5 Extbase 插件缓存实现
- c# - C# WPF 数据绑定和数据上下文
- c - 这个指针是不是越界了?
- javascript - 在 FTL 中调用 java 类函数 - Apache
- icinga2 - Icinga2 导航问题
- arrays - 保存不断附加的自定义对象数组
- excel - Excel IRR:我可以使用它来引用单元格和固定数字的组合吗?内部收益率({-10,11+A2})
- java - Spring jpa @OneToMany one direction always null