Scala MapType 和 Tuple 作为 KeyValue

标签 scala apache-spark

我知道在 Scala 中 MapTypes 被定义为

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

但我不知道如何使用 Tuple 作为 keyType,因为允许的数据类型是

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

如何使用 Tuple 作为 MapType 的 keyType?

最佳答案

“元组类型”是一个 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
)

关于Scala MapType 和 Tuple 作为 KeyValue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48151184/

相关文章:

scala - 结构化的 Spark 流 leftOuter join 的行为类似于 inner join

scala - 处理内部隐式参数列表所需的显式参数

scala - 用Filter代替过滤器

apache-spark - Spark 结构化流 - 限制? (源性能、不支持的操作、Spark UI)

python - Spark运行时错误: uninitialized classmethod object

scala - 处理 Spark UDF 中的所有列/整行

scala - 如何使用Scala提高生产力? (工具,IDE)

斯卡拉 Spark /鲨鱼 : How to access existing Hive tables in Hortonworks?

scala - 从 csv 文件加载约束(amazon deequ)

apache-spark - Databricks DBT 运行时错误,无法连接到数据库。也许是 SSL 错误?