Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何分解带有前缀的结构列?_Scala_Apache Spark_Struct - Fatal编程技术网

Scala 如何分解带有前缀的结构列?

Scala 如何分解带有前缀的结构列?,scala,apache-spark,struct,Scala,Apache Spark,Struct,我的目标是将Spark struct列(已经完成)分解(即,从结构内部获取它们,并将它们作为数据集的剩余列公开),但通过预先添加任意字符串来更改内部字段名。其中一个动机是,我的结构可以包含与外部列同名的列,因此,我需要一种方法来轻松区分它们。当然,我事先不知道结构中的列是什么 以下是我到目前为止的情况: 隐式类隐式(df:DataFrame){ def explodeStruct(列:字符串)=df.选择(“*”,列+“*”).删除(列) } 这项工作做得很好-我使用以下文字: df.expl

我的目标是将Spark struct列(已经完成)分解(即,从结构内部获取它们,并将它们作为数据集的剩余列公开),但通过预先添加任意字符串来更改内部字段名。其中一个动机是,我的结构可以包含与外部列同名的列,因此,我需要一种方法来轻松区分它们。当然,我事先不知道结构中的列是什么

以下是我到目前为止的情况:

隐式类隐式(df:DataFrame){
def explodeStruct(列:字符串)=df.选择(“*”,列+“*”).删除(列)
}
这项工作做得很好-我使用以下文字:

df.explodeStruct(“myColumn”)
它返回原始dataframe中的所有列,以及末尾结构的内部列

至于前缀的前缀,我的想法是取列并找出它的内部列。我浏览了文档,在Column类中找不到任何方法可以这样做。然后,我改变了方法,采用DataFrame的模式,然后根据列的名称过滤结果,并从结果数组中提取找到的列。问题是我找到的这个元素的类型是StructField——它同样没有提供提取其内部字段的选项——而我真正想要的是处理StructType元素——它有
.getFields
方法,这正是我想要的(也就是说,向我显示内部列的名称,这样我就可以对它们进行迭代并在select上使用它们,在前缀前面加上我想要的前缀)。我不知道如何将StructField转换为StructType

我的最后一次尝试是解析StructField.toString的输出——它包含所有内部列的名称和类型,尽管这感觉非常脏,我宁愿避免这种低级的方法


这个问题有没有优雅的解决方案?

好吧,在再次阅读我自己的问题后,我找到了一个优雅的解决方案——我只需要按照我的方式选择所有列,然后将其与原始数据框进行比较,以找出新列。这是最终结果——我也这样做了分解的列将显示在与原始结构列相同的位置,以便不中断信息流:

隐式类隐式(df:DataFrame){
def explodeStruct(列:字符串)={
val prefix=列+“\ux”
val originalPosition=df.columns.indexOf(column)
val dfWithAllColumns=df。选择(“*”,列+“*”)
val explodedColumns=dfWithAllColumns.columns diff df.columns
val prefixedExplodedColumns=explodedColumns.map(c=>col(column+““+c”)作为前缀+c)
val finalColumnsList=df.columns.map(col.patch)(原始位置,前缀为dexplodedcolumns,1)
df.select(最终列列表:*)
}
}
当然,您可以自定义前缀、分隔符等,但这很简单,任何人都可以调整参数等。用法保持不变