Spark 1.6.2下createDataFrame的Map嵌套Struct类型Schema请求
解决Spark 1.6.2中定义包含Map类型的DataFrame Schema问题
针对你需要的Schema结构,我直接给出适配Spark 1.6.2 API的完整代码和说明:
1. 导入必要的类型类
首先要引入Spark SQL的核心类型定义类:
import org.apache.spark.sql.types._
2. 分步构造目标Schema
先定义PRODUCT_IMAGE_MAP中value对应的结构体类型,再组合成完整的Schema:
// 定义PRODUCT_IMAGE_MAP的value所对应的StructType val imageValueStruct = StructType(Seq( StructField("image_path", StringType, nullable = true), StructField("image_id", StringType, nullable = true), StructField("image_name", StringType, nullable = true) )) // 构造最终的目标Schema val targetSchema = StructType(Seq( StructField( name = "PRODUCT_IMAGE_MAP", dataType = MapType(StringType, imageValueStruct, valueContainsNull = true), nullable = true ), StructField( name = "SKU_ID_SITE_MAP", dataType = MapType(StringType, StringType, valueContainsNull = true), nullable = true ) ))
3. 示例:用RDD创建符合Schema的DataFrame
这里给你一个可运行的完整示例,包含构造适配Schema的RDD数据,再调用createDataFrame:
// 构造示例RDD数据,元素顺序对应Schema中的两个Map字段 val sampleDataRDD = sc.parallelize(Seq( ( // 第一个字段:PRODUCT_IMAGE_MAP的内容 Map( "main" -> ("/product/main.png", "IMG_M001", "主图"), "thumbnail" -> ("/product/thumb.png", "IMG_T001", "缩略图") ), // 第二个字段:SKU_ID_SITE_MAP的内容 Map("US" -> "SKU_US_789", "JP" -> "SKU_JP_101") ) )) // 创建DataFrame val df = sqlContext.createDataFrame(sampleDataRDD, targetSchema) // 验证Schema是否符合预期 df.printSchema()
关键注意事项
- Spark 1.6.2的
MapType构造函数必须传入三个参数:keyType、valueType、valueContainsNull,这里要明确设置valueContainsNull = true来匹配你给出的Schema要求; - RDD中元素的字段顺序必须和
targetSchema里StructField的顺序完全一致; - 结构体中每个字段的
nullable属性要和你提供的Schema定义保持一致。
内容的提问来源于stack exchange,提问作者Chandra
相关产品推荐
相关产品推荐

