Spark createDataFrame无法解析重载方法报错原因及修复方案
错误产生原因
该报错由createDataFrame方法入参类型和重载签名不匹配导致:
Spark 提供的createDataFrame方法中,接收StructType作为schema入参的重载版本,要求第一个数据参数必须是Seq[org.apache.spark.sql.Row]类型。示例代码中传入的data1是Scala元组构成的Seq[(String, Int, String, String)],不存在对应参数组合的重载实现,编译器无法找到匹配的方法因此抛出错误。
若代码未提前导入Spark SQL类型相关依赖,会进一步导致类型识别失败,触发同类报错。
修复方案
- 将原有元组格式的数据集转换为
Seq[Row]类型,每条数据用Row()构造方法包裹 - 补充导入Spark SQL所需的基础依赖类,保证所有类型可被正常解析
修复后可直接运行的代码如下:
// 补全缺失的依赖导入 import org.apache.spark.sql.SparkSession import org.apache.spark.sql.types._ import org.apache.spark.sql.Row val data1 = Seq( Row("Android", 1, "2021-07-24 12:01:19.000", "play"), Row("Android", 1, "2021-07-24 12:02:19.000", "stop"), Row("Apple", 1, "2021-07-24 12:03:19.000", "play"), Row("Apple", 1, "2021-07-24 12:04:19.000", "stop") ) val schema1 = StructType(Array( StructField("device_id", StringType, true), StructField("video_id", IntegerType, true), StructField("event_timestamp", StringType, true), StructField("event_type", StringType, true) )) val spark = SparkSession.builder() .enableHiveSupport() .appName("PlayStop") .getOrCreate() val transaction = spark.createDataFrame(data1, schema1)
*可选简化方案:如果不需要严格手动定义schema的可空属性等细节,可以直接使用Spark隐式转换提供的toDF方法,从元组Seq直接创建DataFrame,无需手动构造Row和StructType,代码更简洁:
import org.apache.spark.sql.SparkSession val spark = SparkSession.builder() .enableHiveSupport() .appName("PlayStop") .getOrCreate() import spark.implicits._ val data1 = Seq( ("Android", 1, "2021-07-24 12:01:19.000", "play"), ("Android", 1, "2021-07-24 12:02:19.000", "stop"), ("Apple", 1, "2021-07-24 12:03:19.000", "play"), ("Apple", 1, "2021-07-24 12:04:19.000", "stop") ) val transaction = data1.toDF("device_id", "video_id", "event_timestamp", "event_type")
内容的提问来源于stack exchange,提问作者Alon
相关产品推荐
相关产品推荐

