【发布时间】: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") )
标签: apache-spark dataframe pyspark apache-spark-sql