如何将字符串冒号分隔列转换为MapType?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何将字符串冒号分隔列转换为MapType?相关的知识,希望对你有一定的参考价值。
我试图将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'
现在,注释已经在键值对中,但它被读取为字符串,我想将每个键值对分解为不同的行。对于例如
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))
答案
使用DataFrame API中提供的split
和explode
函数将数据拆分为“,”。要创建地图,您需要使用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)))
以上是关于如何将字符串冒号分隔列转换为MapType?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 MapType(StringType, StringType) 的列转换为 StringType?