Pyspark从文本文件中对RDD

时间:2017-08-01 16:09:35

标签: apache-spark pyspark spark-dataframe rdd

我有一个本地文本文件kv_pair.log,格式化为键值对以逗号分隔,记录以新行开头和终止:

"A"="foo","B"="bar","C"="baz"
"A"="oof","B"="rab","C"="zab"
"A"="aaa","B"="bbb","C"="zzz"

我正在尝试使用pySpark将其读取到Pair RDD,如下所示:

from pyspark import SparkContext
sc=sparkContext()

# Read raw text to RDD
lines=sc.textFile('kv_pair.log')

# How to turn this into a Pair RDD?
pairs=lines.map(lambda x: (x.replace('"', '').split(",")))

print type(pairs)
print pairs.take(2)

我觉得我很亲密!上面的输出是:

[[u'A=foo', u'B=bar', u'C=baz'], [u'A=oof', u'B=rab', u'C=zab']]

所以看起来pairs是一个记录列表,其中包含一对kv对的列表作为字符串。

如何使用pySpark将其转换为Pair RDD,例如键和值是否正确分开?

最终目标是将此对RDD转换为DataFrame以执行SQL操作 - 但是一步一步,请帮助将其转换为配对RDD。

2 个答案:

答案 0 :(得分:1)

您可以将flatMap与自定义函数一起使用,因为lambda不能用于多个语句

def tranfrm(x):
    lst = x.replace('"', '').split(",")
    return [(x.split("=")[0], x.split("=")[1]) for x in lst]

pairs = lines.map(tranfrm)

答案 1 :(得分:0)

对于解析器来说这是非常糟糕的做法,但我相信你的例子可以通过以下方式完成:

from pyspark import SparkContext
from pyspark.sql import Row

sc=sparkContext()

# Read raw text to RDD
lines=sc.textFile('kv_pair.log')

# How to turn this into a Pair RDD?
pairs=lines.map(lambda x: (x.replace('"', '').split(",")))\
           .map(lambda r: Row(A=r[0].split('=')[1], B=r[1].split('=')[1], C=r[2].split('=')[1] )

print type(pairs)
print pairs.take(2)