如何将字符串冒号分隔的列转换为 MapType?

Posted

技术标签:

【中文标题】如何将字符串冒号分隔的列转换为 MapType?【英文标题】:How to convert string colon-separated column to MapType? 【发布时间】:2017-12-19 05:58:11 【问题描述】:

我正在尝试将 Dataframe 转换为 RDD,以便将地图(带有键值对)分解为不同的行。

Info = sqlContext.read.format("csv"). \
option("delimiter","\t"). \
option("header", "True"). \
option("inferSchema", "True"). \
load("file.tsv")

DataFrame[ID: int, Date: timestamp, Comments: string]

DF中的样本数据如下。

ID  Date                    Comments    
1   2015-04-30 22:42:49.0   44:'xxxxxxxx'
2   2015-05-06 08:53:18.0   83:'aaaaaaaaa', 175:'bbbbbbbbb', 86:'cccccccccc'
3   2015-05-13 19:57:13.0   487:'yyyyyyyyyyy', 48:'zzzzzzzzzzzzzz'

现在,cmets 已经在键值对中,但它被读取为字符串,我想将每个键值对分解为不同的行。例如

Expected OUTPUT
ID  Date                     Comments   
1   2015-04-30 22:42:49.0    44:'xxxxxxxx'
2   2015-05-06 08:53:18.0    83:'aaaaaaaaa'
2   2015-05-06 08:53:18.0    175:'bbbbbbbbb'
2   2015-05-06 08:53:18.0    86:'cccccccccc'
3   2015-05-13 19:57:13.0    487:'yyyyyyyyyyy'
3   2015-05-13 19:57:13.0    48:'zzzzzzzzzzzzzz'

我尝试将其转换为 RDD 并应用 flatMap 但没有成功。我希望返回所有列。我试过这个:

Info.rdd.flatMap(lambda x: (x['SearchParams'].split(':'), x))

【问题讨论】:

便宜的把戏:df.withColumn("comments", split(regexp_replace(col("comments"), "," , ",").as("comments") , ",").as("comments") ) 【参考方案1】:

使用 DataFrame API 中提供的splitexplode 函数来拆分“,”上的数据。要创建地图,您需要使用create_map。此函数需要两个单独的列作为输入。下面是一个创建两个临时列的示例(再次使用split):

Info.withColumn("Comments", explode(split(col("Comments"), ", ")))
  .withColumn("key", split(col("Comments"), ":").getItem(0))
  .withColumn("value", split(col("Comments"), ":").getItem(1))
  .withColumn("Comments", create_map(col("key"), col("value")))

应该可以这样缩短(未测试):

Info.withColumn("Comments", split(explode(split(col("Comments), ", ")), ":")
  .withColumn("Comments", create_map(col("Comments".getItem(0)), col("Comments").getItem(1)))

【讨论】:

感谢 Shaido。我提到了你的建议,它工作得很好。虽然我为拆分和爆炸创建了单独的函数。

以上是关于如何将字符串冒号分隔的列转换为 MapType?的主要内容,如果未能解决你的问题,请参考以下文章

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

如何将字符串空格分隔的键,唯一字的值对转换为字典

T-SQL -- 将逗号分隔的列转换为多列

GNU Make 将空格转换为冒号

如何在不丢失科学记数法的情况下将列转换为单个管道分隔的列?

将整列整数转换为字符串,在 Pandas 中使用逗号分隔千位