如何将MapType(StringType,StringType)的列转换为StringType?

时间:2017-12-13 13:48:19

标签: apache-spark pyspark pyspark-sql spark-structured-streaming

所以我有这个流数据帧,我正在尝试将这个'customer_ids'列转换为一个简单的字符串。

setTimeout

打算进行此转换是按此列进行分组,并通过max(date)聚集这样

schema = StructType()\
    .add("customer_ids", MapType(StringType(), StringType()))\
    .add("date", TimestampType())

original_sdf = spark.readStream.option("maxFilesPerTrigger", 800)\
    .load(path=source, ftormat="parquet", schema=schema)\
    .select('customer_ids', 'date')

但我得到了这个例外

original_sdf.groupBy('customer_ids')\
  .agg(max('date')) \
  .writeStream \
  .trigger(once=True) \
  .format("memory") \
  .queryName('query') \
  .outputMode("complete") \
  .start()

如何将此类流式DataFrame列或其他任何方式转换为groupBy此列?

1 个答案:

答案 0 :(得分:1)

TL; DR 使用getItem方法访问MapType列中每个键的值。

真正的问题是您想要groupBy的密钥,因为MapType列可以包含各种密钥。每个键都可以是一个包含map列值的列。

您可以使用Column.getItem方法(或类似的python巫术)访问密钥:

  

getItem(key:Any):Colum 一个表达式,它从数组中获取位置序号,或者通过MapType中的键键获取值。

(我使用Scala并将其转换为pyspark作为家庭练习)

val ds = Seq(Map("hello" -> "world")).toDF("m")
scala> ds.show(false)
+-------------------+
|m                  |
+-------------------+
|Map(hello -> world)|
+-------------------+

scala> ds.select($"m".getItem("hello") as "hello").show
+-----+
|hello|
+-----+
|world|
+-----+
相关问题