Spark Scala报not found: value transform错误无法解决怎么办
报错原因排查
- 核心原因1:Spark版本低于2.4
transform数组高阶函数是Spark 2.4版本才正式加入spark.sql.functions的内置函数,低于该版本的环境无法识别该函数,即便导入全量functions也会提示找不到值。 - 核心原因2:版本满足但写法存在兼容性问题
若确认Spark版本 >=2.4仍报错,大概率是单引号列标识'min_date和函数入参要求不兼容,或者存在导入冲突。
解决方案
方案1:优先适配高版本Spark(推荐)
- 先在Zeppelin中执行
sc.version确认当前Spark版本,若低于2.4先升级到2.4及以上稳定版 - 调整代码写法,将列标识改为
$符号写法,确保导入语句覆盖transform:
// 确保导入全量函数 import org.apache.spark.sql.functions._ import sqlContext.implicits._ // 调整transform部分的列引用写法 val output = tempDF.withColumn("min_date", split($"col2" , ",")) .withColumn("min_date", array_min(transform($"min_date", c => to_timestamp(regexp_extract(c, "\\|(.*)$", 1))))) .show(10,false)
方案2:低版本Spark兼容方案(无需升级)
如果无法升级Spark版本,可以用explode + 分组聚合的方式实现相同逻辑,兼容所有2.x版本Spark:
import org.apache.spark.sql.functions._ import sqlContext.implicits._ val users = sc.textFile("path to file").map(x=>x.replaceAll("\\(","")).map(x=>x.replaceAll("\\)","")).map(x=>x.replaceFirst(",","*")).toDF("column") val tempDF = users.withColumn("_tmp", split($"column", "\\*")).select( $"_tmp".getItem(0).as("col1"), $"_tmp".getItem(1).as("col2") ) val output = tempDF.withColumn("date_arr", split($"col2" , ",")) // 展开数组每个元素 .withColumn("date_item", explode($"date_arr")) // 提取时间戳 .withColumn("ts", to_timestamp(regexp_extract($"date_item", "\\|(.*)$", 1))) // 分组取最小时间 .groupBy("col1", "col2") .agg(min("ts").as("min_date")) .show(10,false)
内容的提问来源于stack exchange,提问作者PixieDev
相关产品推荐
相关产品推荐

