我有一个本地文本文件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。
答案 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)