Apache spark spark dataframe行上的映射函数以分析结构类型
我有一个spark数据框,它是使用以下方法构建的: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
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优化器解析,而映射调用是优化器的“黑盒”
可以找到这些访问方法的更多示例