我正在学习spark,我有下面的xml,我想从中读取2个值并创建两个不同的列
<appRoot>
<applist>
<app type="test">
<code>8.52544</code>
</app>
<app type="dev">
<code>8.52537</code>
</app>
</applist>
</appRoot>
我想要
如果type=“test”,则应在新列“app\u test”中设置值(即8.52544),并
如果type=“dev”,则应在新列“app\u dev”中设置值(即8.52537)
我在下面试过了
df.select(
functions.when($"applist.app._type" === "test", $"applist.app.code").as("app_test"),
functions.when($"applist.app._type" === "dev", $"applist.app.code").as("app_dev"))
但它又回来了
app_test with value [8.52544, 8.52537]
app_dev with value [8.52544, 8.52537]
设置列的值时如何区分?
更新:
val df = spark.read
.format("com.databricks.spark.xml")
.option("rootTag", "appRoot")
.option("rowTag", "applist")
.load("test.xml")
df.printSchema()
root
|-- app: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- _type: string (nullable = true)
| | |-- code: double (nullable = true)
2条答案
按热度按时间kgqe7b3p1#
使用map\从\项将数组转换为map
_type
作为钥匙和code
作为价值观。然后可以使用Map创建两个新列。打印(带有一些附加测试数据)
owfi6suc2#
您可以通过以下方式实现:
将数据读入Dataframe。
最后,您可以在when条件下通过分解数组来选择适当的列:
如果您希望输出在一行中,可以使用max()函数进行聚合。