Scala MapType和Tuple为KeyValue

时间:2018-01-08 13:20:21

标签: scala apache-spark

我知道在Scala MapTypes中定义为

public MapType(DataType keyType,
               DataType valueType,
               boolean valueContainsNull)

但我不知道如何使用Tuple作为keyType,因为允许的DataTypes是

Direct Known Subclasses:
ArrayType, BinaryType, BooleanType, CalendarIntervalType, DateType, HiveStringType, MapType, NullType, NumericType, ObjectType, StringType, StructType, TimestampType

如何使用Tuple作为MapType的keyType?

1 个答案:

答案 0 :(得分:2)

“元组类型”是StructType所以例如(String, Double)是一个结构:

StructType(Seq(
  StructField("_1", StringType, true),
  StructField("_2", DoubleType, false)))

使用StructField个对象枚举字段。

请记住,架构通常适用于Row个对象:

val schema = StructType(Seq(StructField("map", MapType(
     StructType(Seq(
       StructField("_1", StringType, true),
        StructField("_2", DoubleType, false))),
     LongType))))

spark.createDataFrame(
  spark.sparkContext.parallelize(Seq(Row(Map(Row("foo", 1.1D) -> 1L)))),
  schema
)

如果数据是严格键入的,则不需要架构

spark.createDataFrame(Seq(Tuple1(Map(( "foo", 1.1D) -> 1L))))

并且不支持混合的强/弱类型对象:

spark.createDataFrame(
  spark.sparkContext.parallelize(Seq(Row(Map(( "foo", 1.1D) -> 1L)))),
  schema
)