Apache spark spark dataframe行上的映射函数以分析结构类型

Apache spark spark dataframe行上的映射函数以分析结构类型,apache-spark,apache-spark-sql,Apache Spark,Apache Spark Sql,我有一个spark数据框,它是使用以下方法构建的: val empData = Seq( Row("1", "s1", Row("f1", "l1")), Row("2", "s2", Row("f2", "l2")), Row("3", "s3", null) ) val empSchema = new StructType() .add("emp_id", StringType, true) .add("emp_state", StringType, true) .a

我有一个spark数据框,它是使用以下方法构建的:

val empData = Seq(
  Row("1", "s1", Row("f1", "l1")),
  Row("2", "s2", Row("f2", "l2")),
  Row("3", "s3", null)
)
val empSchema = new StructType()
  .add("emp_id", StringType, true)
  .add("emp_state", StringType, true)
  .add("emp_name", new StructType()
    .add("firstname", StringType, true)
    .add("lastname", StringType, true),
    true)
val empDF = spark.createDataFrame(spark.sparkContext.parallelize(empData), empSchema)
我试图用emp_name的firstname(emp_name是struct类型)替换数据帧中的每一行。下面的代码有什么问题

def mapDFRowsUsingRowOperator_getSeq_forStructType(df: DataFrame) = {
   df.map(r => { r.getAs[Row]("emp_name").getAs[String]("firstname") } )
 }
我看到了错误:

 Unable to find encoder for type org.apache.spark.sql.Row. 
我们还可以将getStruct()用于此用例,以更改下面的函数

def mapDFRowsUsingRowOperator_getSeq_forStructType(df: DataFrame) = {
   df.map(r => { r.getAs[Row]("emp_name").getAs[String]("firstname") } )
}

更改以下功能

def mapDFRowsUsingRowOperator_getSeq_forStructType(df: DataFrame) = {
   df.map(r => { r.getAs[Row]("emp_name").getAs[String]("firstname") } )
}


可以使用点访问嵌套列的值:

empDF.select(“emp_id”、“emp_state”、“emp_name.firstname”、“emp_name.lastname”).show()
印刷品

+------+---------+---------+--------+
|emp|u id | emp|u state | firstname | lastname|
+------+---------+---------+--------+
|1 | s1 | f1 | l1|
|2 | s2 | f2 | l2|
|3 | s3 |空|空|
+------+---------+---------+--------+
这是访问结构元素的一种更简单的方法,并且需要更少的代码。此外,您可能会获得性能改进,因为这些表达式可以由Catalyst优化器解析,而映射调用是优化器的“黑盒”


可以找到这些访问方法的更多示例。

您可以使用点访问嵌套列的值:

empDF.select(“emp_id”、“emp_state”、“emp_name.firstname”、“emp_name.lastname”).show()
印刷品

+------+---------+---------+--------+
|emp|u id | emp|u state | firstname | lastname|
+------+---------+---------+--------+
|1 | s1 | f1 | l1|
|2 | s2 | f2 | l2|
|3 | s3 |空|空|
+------+---------+---------+--------+
这是访问结构元素的一种更简单的方法,并且需要更少的代码。此外,您可能会获得性能改进,因为这些表达式可以由Catalyst优化器解析,而映射调用是优化器的“黑盒”

可以找到这些访问方法的更多示例