Apache spark Spark数据集:数据集的强制转换列

Apache spark Spark数据集:数据集的强制转换列,apache-spark,dataset,Apache Spark,Dataset,这是我的数据集: Dataset<Row> myResult = pot.select(col("number") , col("document") , explode(col("mask")).as("mask")); 我的问题是:文档属于column类型,我需要将其转换为不同的对象类型,并对其进行解析以提取名称、年龄和类别。我该怎么做呢。文档是xml,我需要进行解析以获取其他3列,因此无法避免

这是我的数据集:

  Dataset<Row> myResult = pot.select(col("number")
                    , col("document")
                    , explode(col("mask")).as("mask"));

我的问题是:文档属于column类型,我需要将其转换为不同的对象类型,并对其进行解析以提取名称、年龄和类别。我该怎么做呢。文档是xml,我需要进行解析以获取其他3列,因此无法避免将其转换为xml。

extract
方法转换为xml将是一个尽可能接近您要求的解决方案。UDF可以获取一个或多个列的值,并使用此输入执行任何逻辑

import org.apache.spark.sql.expressions.UserDefinedFunction;
导入org.apache.spark.sql.types.DataTypes;
导入静态org.apache.spark.sql.functions.col;
导入静态org.apache.spark.sql.functions.udf;
[...]
UserDefinedFunction extract=udf(
(字符串文档)->{
列表结果=新建ArrayList();
XMLParser doc=XMLParser.parse(文档);
字符串名称=…//从xml文档读取名称
字符串年龄=…//从xml文档读取年龄
String clazz=…//从xml文档读取类
结果。添加(名称);
结果:添加(年龄);
结果。添加(clazz);
返回结果;
},DataTypes.createArrayType(DataTypes.StringType)
);
UDF的一个限制是它们只能返回一列。因此,该函数返回一个字符串数组,该数组必须在以后解压缩

数据集myResultNew=myResult
.withColumn(“extract”,extract.apply(col(“document”))//1
.withColumn(“name”,col(“extract”).getItem(0))//2
.withColumn(“age”,col(“extract”).getItem(1))//2
.withColumn(“class”,col(“extract”).getItem(2))//2
.删除(“文件”、“摘录”)//3.
  • 调用UDF并使用包含xml文档的列作为
    apply
    函数的参数
  • 从步骤1返回的数组中创建结果列
  • 放下中间的柱子
  • 注意:数据集中每行执行一次udf。如果xml解析器的创建成本很高,这可能会降低Spark作业的执行速度,因为每行实例化一个解析器。由于Spark的并行特性,不可能在下一行中重用解析器。如果这是一个问题,另一个选择(至少在Java世界中稍微复杂一点)是使用。在这里,每行不需要一个解析器,但数据集的每个分区只需要一个解析器

    一种完全不同的方法是使用

      Dataset<Row> myResultNew = myResult.select(col("number")
                    , col("name")
                    , col("age")
                    , col("class")
                    , col("mask");
    
    myResult.select(extract(col("document")));
    
    
     private String extract(final Column document) {
            //TODO ADD A NEW COLUMN nam, age, class TO THE NEW DATASET.
            // PARSE DOCUMENT AND GET THEM.
    
         XMLParser doc= (XMLParser) document // this doesnt work???????
    
    
    
    
    }