apache-spark - 如何使用数据帧在 spark-scala 中读取此自定义文件
问题描述
我有一个格式为:
ID|Value
1|name:abc;org:tec;salary:5000
2|org:Ja;Designation:Lead
如何使用 Dataframes 阅读此内容?所需的输出是:
1,name,abc
1,org,tec
2,org,Ja
2,designation,Lead
请帮忙
解决方案
您将需要一些临时字符串解析,因为我认为没有内置解析器可以完全满足您的需求。|
我希望您对自己的格式以及特殊字符( 、:
和;
)不会出现在您的字段中这一事实充满信心,因为它会搞砸一切。
鉴于此,您可以通过几个简单split
的 s 和 anexplode
来获得结果,将字典中的每个属性放在不同的行上。
val raw_df = sc.parallelize(List("1|name:abc;org:tec;salary:5000", "2|org:Ja;Designation:Lead"))
.map(_.split("\\|") )
.map(a => (a(0),a(1))).toDF("ID", "value")
raw_df
.select($"ID", explode(split($"value", ";")).as("key_value"))
.select($"ID", split($"key_value", ":").as("key_value"))
.select($"ID", $"key_value"(0).as("property"), $"key_value"(1).as("value"))
.show
结果:
+---+-----------+-----+
| ID| property|value|
+---+-----------+-----+
| 1| name| abc|
| 1| org| tec|
| 1| salary| 5000|
| 2| org| Ja|
| 2|Designation| Lead|
+---+-----------+-----+
编辑:或者,您可以在值字段上使用from_json
函数(https://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.sql.functions $)来解析它. 但是,您仍然需要将结果分解为单独的行并将结果对象的每个元素分派到所需的列中。使用您给出的简单示例,这不会更简单,因此归结为品味问题。