如何解决使用Scala和Spark读取文本文件中的键/值对,键作为列名,值作为行
我有以下格式的文本文件。
<Begin
Id=1
Name=John
Age=32
<End
<Begin
Id=2
Name=Jack
Age=20
<End
我想要做的是使用Scala在Spark中创建一个数据框,以上述键为列名 及其值作为数据框中的行。请注意,我有几个Begin-End部分以及几个键值对。
我已将键和值分隔到单独的列,并尝试将键行值转换为列名,但失败了。这就是我所做的:
val test = textRDD.filter(rows => !rows.contains("<Begin")).filter(rows => !rows.contains("<End")).map {
line =>
val har = line.split("=")
Table1(har(0),har(1))
}
val testDF = test.toDF()
testDF.show()
这是我的案例课
case class Table1(columNames:String,valuesCol:String)
输出-:
+------------+-----------+
| columNames | valuesCol |
+------------+-----------+
| Id | 1 |
| Name | John |
| Age | 32 |
| Id | 2 |
| Name | Jack |
| Age | 20 |
+------------+-----------+
必需的输出-:
+----+------+-----+
| Id | Name | Age |
+----+------+-----+
| 1 | John | 32 |
| 2 | Jack | 20 |
+----+------+-----+
I'm using Spark 2.4.0
Thanks.
解决方法
尝试这个。为了使用数据透视表,您应该具有用于将这些值分组为一行的单独键。因此,我添加了它并使用数据透视表。
val w = Window.rowsBetween(Window.unboundedPreceding,Window.currentRow)
df.withColumn("group",when('columNames === lit("Id"),1))
.withColumn("group",sum('group).over(w))
.groupBy("group").pivot("columNames",Seq("Id","Name","Age")).agg(first("valuesCol"))
.drop("group")
.show()
+---+----+---+
| Id|Name|Age|
+---+----+---+
| 1|John| 32|
| 2|Jack| 20|
+---+----+---+
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。