Scala Spark DataFrame从Magellan Polyline列提取字段报错求助
解决Magellan Polyline类型字段提取问题
你遇到的问题很典型——Magellan的Polyline是自定义的UserDefinedType(UDT),不是Spark原生的Struct类型,所以直接用$"polyline"("xcoordinates")这种针对struct的访问语法肯定会报错。
下面给你两种可行的解决方案,优先推荐第一种,更简洁高效:
方法一:使用expr函数直接访问属性
Magellan的Polyline类本身提供了xcoordinates和ycoordinates的getter方法,Spark的expr函数可以识别并调用这些方法,直接提取字段:
import org.apache.spark.sql.functions.expr val resultDF = spark.read .format("magellan") .load(My_Path) .withColumn("xcoordinates", expr("polyline.xcoordinates")) // 如果需要提取y坐标,同理 // .withColumn("ycoordinates", expr("polyline.ycoordinates")) .drop("polyline")
方法二:转JSON再解析为Struct(兼容场景更广)
如果第一种方法因为版本问题不生效,还可以先把Polyline序列化为JSON字符串,再解析成Spark原生的Struct类型,之后就可以用常规方式访问字段了:
import org.apache.spark.sql.functions.{to_json, from_json, col} import org.apache.spark.sql.types.{ArrayType, DoubleType, StructType} // 定义对应Polyline的JSON Schema val polylineSchema = new StructType() .add("xcoordinates", ArrayType(DoubleType)) .add("ycoordinates", ArrayType(DoubleType)) val resultDF = spark.read .format("magellan") .load(My_Path) .withColumn("polyline_json", to_json(col("polyline"))) .withColumn("polyline_struct", from_json(col("polyline_json"), polylineSchema)) .withColumn("xcoordinates", col("polyline_struct.xcoordinates")) .drop("polyline", "polyline_json", "polyline_struct")
两种方法都能帮你提取出需要的坐标数组,根据你的Magellan版本选择合适的即可。
内容的提问来源于stack exchange,提问作者Nakeuh
相关产品推荐
相关产品推荐

