【发布时间】:2018-07-17 06:32:12
【问题描述】:
我想在 Spark 中迭代一个模式。使用df.schema 给出嵌套的StructType 和StructFields 的列表。
根元素可以像这样被索引。
IN: val temp = df.schema
IN: temp(0)
OUT: StructField(A,StringType,true)
IN: temp(3)
OUT: StructField(D,StructType(StructField(D1,StructType(StructField(D11,StringType,true), StructField(D12,StringType,true), StructField(D13,StringType,true)),true), StructField(D2,StringType,true), StructField(D3,StringType,true)),true)
当我尝试访问嵌套的StructType 时,会发生以下情况
IN: val temp1 = temp(3).dataType
IN: temp1(0)
OUT:
Name: Unknown Error
Message: <console>:38: error: org.apache.spark.sql.types.DataType does not take parameters
temp1(0)
^
StackTrace:
我不明白的是temp 和temp1 都属于StructType 类,但temp 是可迭代的,但temp1 不是。
IN: temp.getClass
OUT: class org.apache.spark.sql.types.StructType
IN: temp1.getClass
OUT: class org.apache.spark.sql.types.StructType
我也尝试了dtypes,但在尝试访问嵌套元素时遇到了类似的问题。
IN: df.dtypes(3)(0)
OUT:
Name: Unknown Error
Message: <console>:36: error: (String, String) does not take parameters
df.dtypes(3)(0)
^
StackTrace:
那么,如何在知道子字段之前遍历架构?
【问题讨论】:
-
您能否更具体地说明您实际想要达到的目标?
-
我认为您在 sn-p 中遇到错误,因为您将 temp1 分配给
temp(3).dataType而不是temp(3)。dataType方法只返回结构的类型,而不是结构本身。 -
@addmeaning 我希望能够遍历架构结构。在您的最后一个答案中,我可以访问每个元素,但前提是我知道嵌套字段的确切路径。但是,我的数据集包含数百个嵌套数据字段。所以,如果我可以拥有自己的模式表示,我认为遍历数据框会更容易。
标签: scala apache-spark