Python 将键/值对的Pyspark RDD解析为.csv格式

Python 将键/值对的Pyspark RDD解析为.csv格式,python,parsing,apache-spark,lambda,pyspark,Python,Parsing,Apache Spark,Lambda,Pyspark,我正在构建一个解析器,它接受一个包含key=value对的原始文本文件,并使用PySpark写入一个tablar/.csv结构 我陷入困境的地方是,我可以访问函数中的键和值来构造每个csv_行,甚至可以检查这些键是否等于预期键列表col_list,但当我在lambda中调用该函数processCsv时,我不知道如何将每个csv_行附加到列表l_of_l的全局列表中,该列表用于保存.csv行的最终列表 如何迭代键/值格式的RDD的每条记录并解析为.csv格式?正如你所看到的,我的列表l的最终列表是

我正在构建一个解析器,它接受一个包含key=value对的原始文本文件,并使用PySpark写入一个tablar/.csv结构

我陷入困境的地方是,我可以访问函数中的键和值来构造每个csv_行,甚至可以检查这些键是否等于预期键列表col_list,但当我在lambda中调用该函数processCsv时,我不知道如何将每个csv_行附加到列表l_of_l的全局列表中,该列表用于保存.csv行的最终列表

如何迭代键/值格式的RDD的每条记录并解析为.csv格式?正如你所看到的,我的列表l的最终列表是空的,但是我可以得到循环中的每一行。。。令人沮丧

感谢所有建议

原始文本结构foo.log:

"A"="foo","B"="bar","C"="baz"
"A"="oof","B"="rab","C"="zab"
"A"="aaa","B"="bbb","C"="zzz"
迄今为止的做法:

from pyspark import SparkContext
from pyspark import SQLContext
from pyspark.sql import Row

sc=SparkContext('local','foobar')
sql = SQLContext(sc)

# Read raw text to RDD
lines=sc.textFile('foo.log')
records=lines.map(lambda x: x.replace('"', '').split(","))

print 'Records pre-transform:\n'
print records.take(100)
print '------------------------------\n'

def processRecord(record, col_list):    
    csv_row=[]
    for idx, val in enumerate(record):
        key, value = val.split('=')        
        if(key==col_list[idx]):
            # print 'Col name match'
            # print value
            csv_row.append(value)
        else:
            csv_row.append(None)
            print 'Key-to-Column Mismatch, dropping value.'
    print csv_row
    global l_of_l
    l_of_l.append(csv_row)

l_of_l=[]
colList=['A', 'B', 'C']
records.foreach(lambda x: processRecord(x, col_list=colList))

print 'Final list of lists:\n'
print l_of_l
输出:

Records pre-transform:
[[u'A=foo', u'B=bar', u'C=baz'], [u'A=oof', u'B=rab', u'C=zab'], [u'A=aaa', u'B=bbb', u'C=zzz']]
------------------------------

[u'foo', u'bar', u'baz']
[u'oof', u'rab', u'zab']
[u'aaa', u'bbb', u'zzz']

Final list of lists:
[]
尝试此功能:

def processRecord(record, col_list):    
    csv_row=list()
    for idx, val in enumerate(record):
        key, value = val.split('=')        
        if(key==col_list[idx]):
            # print 'Col name match'
            # print value
            csv_row.append(value)
        else:
            csv_row.append(None)
            # print 'Key-to-Column Mismatch, dropping value.'
    return csv_row
然后

colList=['A', 'B', 'C']
l_of_l = records.map(lambda x: processRecord(x, col_list=colList)).collect()

print 'Final list of lists:\n'
print l_of_l
应该给

Final list of lists: 
[[u'foo', u'bar', u'baz'], [u'oof', u'rab', u'zab'], [u'aaa', u'bbb', u'zzz']]

你能举一个例子说明l_of l应该是什么样的,即,确切的期望输出是什么吗?当然可以@desertnaut,谢谢你的关注。我希望打印的l_的l_会产生:[[foo]、[bar]、[baz]、[oof]、[rab]、[zab]、[aaa]、[bbb]、[zzz']]因为对这个问题的清晰的阐述而获得更高的投票率-现在在so中很少,特别是来自新用户…谢谢@desertnaut,我在java论坛和类似的地方学到了关于SSCCE的艰难方法!非常感谢,我从来没有想过要将l_of u l设置为等于记录。map*显然,我有很多东西要学习-PySpark的整个匿名功能对我来说是一个挑战,你能推荐一些好的学习材料/资源吗?再次感谢!:不客气。不幸的是,除了文档之外,我还不知道PySpark有什么好的来源……我想它就像任何新的东西一样,通过不断地学习,在朋友们的慷慨帮助下。希望在我更好地掌握PySpark的第一周后,能在这里贡献自己的力量。有没有一种方法可以在数据框架中做到这一点?