我有以下XML文件,每个表都有不同的属性名,每个at_name的模式也不同。这是一个很长的文件,我只在这里发布了几行:
<CATALOG>
<TABLE at_name="Furniture">
<ROWDATA>
<ROW typeid="0" caseid="0" key="1" code="0"/>
<ROW typeid="1" caseid="0" key="1" code="0"/>
<ROW typeid="1" caseid="1" key="1" code="0"/>
</ROWDATA>
</TABLE>
<TABLE at_name="Cutlery">
<ROWDATA>
<ROW cutleryTypeid="0" color="Blue" code="0"/>
<ROW cutleryTypeid="0" color="Blue" code="0"/>
</ROWDATA>
</TABLE>
<TABLE at_name="Apparel">
<ROWDATA>
<ROW ApparelTypeid="1" color="Blue" barcode="0111"/>
<ROW ApparelTypeid="0" color="Blue" barcode"1122"/>
</ROWDATA>
</TABLE>
<CATALOG>
为了阅读XML,我为scala中的每个属性定义了自定义模式,其中一个用于家具:
//Function to read XML furniture
def getFurniture: StructType = {
val rowType = new StructType()
.add("_typeid", StringType)
.add("_caseid", StringType)
.add("_key", StringType)
.add("_code", StringType)
val rowDataType = new StructType()
.add("ROW", ArrayType(rowType))
val furniType = new StructType()
.add("_at_name", StringType)
.add("ROWDATA", rowDataType)
furniType
}
//In the main class
val cabinetDF = session.read
.option("rootTag", "CATALOG")
.option("rowTag", "TABLE")
.schema(schema)
.xml(filePath)
.filter("_at_name = 'Furniture'")
当我运行此代码时,我会得到此数据帧:
+---------+--------------------------------------------+
|_at_name |ROWDATA |
+---------+--------------------------------------------+
|Furniture|{[{0, 0, 1, 0}, {1, 0, 1, 0}, {1, 1, 1, 0}]}|
+---------+--------------------------------------------+
我想要的输出是:
我试图使用爆炸来转换上面的数据帧,但它不起作用,因为我使用了结构类型,它提供了一些额外的括号。有没有其他方法可以获得所需的输出?