복잡한 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을 통해 실행하고 있지만 일종의 Cartesian 조인을 만들고 있습니다.
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와 함께 발행되는 것을 볼 수 있습니다. 어떤 제안이라도 부탁드립니다.
하나의 열을 분해하려고 할 때 출력이 제대로 작동하지만 모든 열을 분해하려고하면 Cartesian 조인이 표시됩니다.
출력을 다음과 같이 원하면
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"))
같은 수준에서 여러 열을 분해하는 해결 방법이 있습니까?
여러 열을 분해하는 솔루션은
df.select(explode(arrays_zip($"col1",$col2))).select( $"col.*").show(20,false)
이 솔루션은 2.4 이상에서 사용할 수 있습니다.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다