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

Apache spark 如何将字符串冒号分隔列转换为MapType?,apache-spark,dataframe,pyspark,apache-spark-sql,Apache Spark,Dataframe,Pyspark,Apache Spark Sql,我试图将数据帧转换为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中的样本数据如下所示 I

我试图将数据帧转换为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\u map
。此函数需要两个单独的列作为输入。下面是创建两个临时列的示例(再次使用
split
):

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


廉价技巧:
df.withColumn(“comments”),split(regexp_replace(col(“comments”),“,”,“},{”).as(“comments”),“,”,”).as(“comments”)
谢谢Shaido。我参考了你的建议,它工作得非常好。尽管我为split和Explode创建了单独的函数。
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)))