gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 02:58:34 24 4
gpt4 key购买 nike

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

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))

最佳答案

使用提供的 splitexplode DataFrame API 中的函数来拆分“,”上的数据。要创建 map ,您需要使用 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)))

关于apache-spark - 如何将字符串冒号分隔的列转换为 MapType?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47880851/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com