首页 > 解决方案 > 如何使用数据帧在 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

请帮忙

标签: apache-sparkapache-spark-sqlspark-streaming

解决方案


您将需要一些临时字符串解析,因为我认为没有内置解析器可以完全满足您的需求。|我希望您对自己的格式以及特殊字符( 、:;)不会出现在您的字段中这一事实充满信心,因为它会搞砸一切。

鉴于此,您可以通过几个简单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 $)来解析它. 但是,您仍然需要将结果分解为单独的行并将结果对象的每个元素分派到所需的列中。使用您给出的简单示例,这不会更简单,因此归结为品味问题。


推荐阅读