【发布时间】:2020-08-28 20:54:54
【问题描述】:
我正在尝试扁平化一个复杂的 XML 结构,下面是 XML 文件 -
<root>
<ATS name="exp_Change_Rec">
<EXP1>
<EXP1INT >
<ExPFLDs>
<ExPFLD precision="10" name="COL1" output="true"/>
<ExPFLD precision="20" name="COL2" output="true"/>
<ExPFLD precision="30" name="COL3" output="true"/>
<ExPFLD precision="40" name="COL4" output="true"/>
</ExPFLDs>
</EXP1INT>
</EXP1>
</ATS>
<ATS name="exp_Change_Flag">
<EXP1>
<EXP1INT >
<ExPFLDs>
<ExPFLD precision="10" name="COL5" output="true"/>
<ExPFLD precision="20" name="COL6" output="true"/>
<ExPFLD precision="30" name="COL7" output="true"/>
</ExPFLDs>
</EXP1INT>
</EXP1>
</ATS>
</root>
我期望输出为 -
Name Value
exp_Change_Rec COL1
exp_Change_Rec COL2
exp_Change_Rec COL3
exp_Change_Rec COL4
exp_Change_Flag COL5
exp_Change_Flag COL6
exp_Change_Flag COL7
我正在通过 databricks spark xml 执行,但它正在创建某种笛卡尔连接 -
import org.apache.spark.sql.SparkSession
import com.databricks.spark.xml.
val df1 = spark.read.option("rowTag", "root").xml("file:///home/sv-infopcdq/spark/sample.xml")
val df2 = df1.withColumn("_name", explode($"ATS._name"))
df2.withColumn("COL_NAMES", explode($"ATS.EXP1.EXP1INT.ExPFLDs.ExPFLD")).show(100)
+--------------------+---------------+--------------------+
| ATS| _name| COL_NAMES|
+--------------------+---------------+--------------------+
|[[[[[[[, COL1, tr...| exp_Change_Rec|[[, COL1, true, 2...|
|[[[[[[[, COL1, tr...| exp_Change_Rec|[[, COL5, true,],...|
|[[[[[[[, COL1, tr...|exp_Change_Flag|[[, COL1, true, 2...|
|[[[[[[[, COL1, tr...|exp_Change_Flag|[[, COL5, true,],...|
在这里,我看到 COL1 同时发出了 exp_Change_Rec 和 exp_Change_Flag。 请有任何建议。
当我尝试分解一列时,输出工作正常,但是当我尝试分解所有列时,它显示笛卡尔连接
如果我希望输出为
Name Value Precision
exp_Change_Rec COL1 10
exp_Change_Rec COL2 20
exp_Change_Rec COL3 30
exp_Change_Rec COL4 40
exp_Change_Flag COL5 10
exp_Change_Flag COL6 20
exp_Change_Flag COL7 30
如果我想扩展正确答案以在其中包含“精度”,它不起作用 -
xml_df.withColumn("_name", ($"_name"))
.withColumn("COL_NAMES",explode($"EXP1.EXP1INT.ExPFLDs.ExPFLD._name")
.withColumn("COL_NAMES",explode($"EXP1.EXP1INT.ExPFLDs.ExPFLD._precision")).drop("EXP1")
.select($"_name".as("Name"), $"COL_NAMES".as("Value"))
请在同一级别上展开多个列的任何解决方法?
【问题讨论】:
标签: scala apache-spark databricks