【问题标题】:How to use explode for a struct type in Scala如何在Scala中使用explode作为结构类型
【发布时间】:2021-09-01 08:20:00
【问题描述】:

我已经使用这样的结构类型从 XML 文件中读取了一些数据:

<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>
<CATALOG>

读取 XML 的代码:

val furntitureDF = session.read
  .option("rootTag", "CATALOG")
  .option("rowTag", "TABLE")
  .schema(getFurnitureSchema)
  .xml(filePath)
  .filter("at_name = 'Furniture'")



   def getFurnitureSchema: 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 FurnitureTableType = new StructType()
       .add("at_name", StringType)
       .add("ROWDATA", rowDataType)

     FurnitureTableType
   }

我得到的输出:

_name ROWDATA
First {[{0, 0, 1, 0 },{1, 0, 1, 0 },{1, 1, 1, 0 }]}

如上所示,我得到了一些额外的括号,所以即使我使用了explode 函数,它也不起作用。预期的输出是:

_name ROWDATA rowid
First {0, 0, 1, 0 } 1
First {1, 0, 1, 0 } 2
First {1, 1, 1, 0 } 3

关于如何获得此结果的任何想法?

【问题讨论】:

  • 添加示例 xml 数据?
  • 请看我的编辑
  • 你为什么要创建getFurnitureSchema 架构?
  • 我使用它是因为 XML 很大,有很多表标签,并且每个属性名称(at_name)的列都不同

标签: xml scala function apache-spark databricks


【解决方案1】:

explode 只会将数组项转换(爆炸)为您的数组项中的单个项,这会在您的输出中执行。

Input - Array<Struct>
Output - Struct (exploded to multiple rows)

现在您必须从每个结构项中提取元素。

这就像

explodedDF.select("`_name`","`ROWDATA`.`_typeid`","`ROWDATA`.`_caseid`",`ROWDATA`.`_key`,`ROWDATA`.`_code`)

【讨论】:

  • Explode 对我不起作用。如果我尝试爆炸,它仍然会在一行中返回相同的数据帧。
猜你喜欢
  • 1970-01-01
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2014-05-22
  • 2020-11-17
  • 2019-02-06
  • 2013-11-28
  • 2021-08-31
相关资源
最近更新 更多