Spark 2.0.0中调用from_json函数提示‘非成员’错误求助
解决Spark 2.0.0中
from_json不存在的错误 你遇到的这个报错核心原因很明确:Spark 2.0.0版本里并没有from_json这个函数——它是在Spark 2.1.0版本才被正式加入到org.apache.spark.sql.functions工具类中的。
下面给你两种可行的解决方案:
方案1:升级Spark依赖版本(推荐)
这是最直接省心的办法,把你的Maven依赖中的Spark版本升级到2.1.0或更高(比如稳定的2.4.x系列,兼容性更好)。修改后的依赖代码如下:
<dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.4.8</version> <!-- 可替换为>=2.1.0的任意稳定版本 --> </dependency>
升级完成后,重新构建项目刷新依赖,你原来的代码就能正常运行了。
方案2:在Spark 2.0.0中手动解析JSON(无法升级版本时)
如果因为业务或环境限制不能升级Spark,你可以通过以下两种方式替代from_json的功能:
方式A:用get_json_object逐个提取字段
适合JSON结构简单、字段不多的场景,通过JSON路径逐个提取需要的字段:
import org.apache.spark.sql.functions.get_json_object // 示例:假设你的目标schema包含id、name两个字段 val parsedDF = df.select( get_json_object($"value".cast("string"), "$.id").alias("id"), get_json_object($"value".cast("string"), "$.name").alias("name") )
方式B:自定义UDF解析整个JSON到样例类
如果需要把JSON直接解析成自定义的event样例类,可以写一个UDF来实现:
import org.apache.spark.sql.functions.udf import scala.util.parsing.json.JSON // 假设你的样例类定义为:case class Event(id: Int, name: String) val jsonToEvent = udf((jsonStr: String) => { JSON.parseFull(jsonStr).map { case map: Map[String, Any] => Event( map("id").asInstanceOf[Int], map("name").asInstanceOf[String] ) }.getOrElse(null) }) val ds = df.select(jsonToEvent($"value".cast("string"))).as[Event]
注意:Scala自带的
JSON.parseFull性能一般,如果处理大数据量,建议集成Jackson或Gson这类专业JSON库来实现UDF,解析效率会更高。
内容的提问来源于stack exchange,提问作者Pinnacle
相关产品推荐
相关产品推荐

