代码之家  ›  专栏  ›  技术社区  ›  Sindu_

如何将具有不同属性模式的XML转换为数据帧

  •  1
  • Sindu_  · 技术社区  · 3 年前

    我有以下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}]}|
    +---------+--------------------------------------------+
    

    我想要的输出是:

    enter image description here

    我试图使用爆炸来转换上面的数据帧,但它不起作用,因为我使用了结构类型,它提供了一些额外的括号。有没有其他方法可以获得所需的输出?

    0 回复  |  直到 3 年前