簡體   English   中英

將2個RDD(其中一個包含unicode數據,另一個具有正常)的數據寫入PySpark中的csv文件時出現問題?

[英]issue in writing data from 2 RDDs (one with unicode data and one with normal )into a csv file in PySpark?

我有兩個RDD's

RDD1集:數據RDD1是Unicode格式

[[u'a',u'b',u'c'],[u'c',u'f',u'a'],[u'ab',u'cd',u'gh']...]

RDD2:

[(10.1, 10.0), (23.0, 34.0), (45.0, 23.0),....]

這兩個RDDs的行數均相同(但一個RDDs在每行/記錄中具有2列/元素,而一個具有3)。 現在我想要做的是采取從所有元素RDD22nd記錄從RDD1 ,並將它們寫出來的csv 本地文件系統(HDFS不)上的文件。 因此,以上示例的csv文件中的輸出為:

a,b,c,10.0
c,f,a,34.0
ab,cd,gh,23.0

我如何在PySpark做到這PySpark

更新:這是我當前的代碼:

columns_num = [0,1,2,4,7]
rdd1 = rdd3.map(lambda row: [row[i] for i in columns_num])

rdd2 = rd.map(lambda tup: (tup[0], tup[1]+ (tup[0]/3)) if tup[0] - tup[1] >= tup[0]/3 else (tup[0],tup[1]))

with open("output.csv", "w") as fw:
    writer = csv.writer(fw)
    for (r1, r2) in izip(rdd1.toLocalIterator(), rdd2.toLocalIterator()):
        writer.writerow(r1 + tuple(r2[1:2]))

我收到錯誤,因為TypeError: can only concatenate list (not "tuple") to list 如果我執行writer.writerow(tuple(r1) + r2[1:2])則會收到UnicodeEncodeError: 'ascii' codec can't encode character u'\\x80' in position 16: ordinal not in range(128)錯誤UnicodeEncodeError: 'ascii' codec can't encode character u'\\x80' in position 16: ordinal not in range(128) `

如果本地表示驅動程序文件系統,則可以簡單地collect或轉換為toLocalIterator並編寫:

import csv
import sys
if sys.version_info.major == 2:
    from itertools import izip
else:
    izip = zip

rdd1 = sc.parallelize([(10.1, 10.0), (23.0, 34.0), (45.0, 23.0)])
rdd2 = sc.parallelize([("a", "b" ," c"), ("c", "f", "a"), ("ab", "cd", "gh")])

with open("output.csv", "w") as fw:
    writer = csv.writer(fw)
    for (r1, r2) in izip(rdd2.toLocalIterator(), rdd1.toLocalIterator()):
        writer.writerow(r1 + r2[1:2])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM