有没有更好的方法来编写此pyspark拆分代码?

时间:2019-08-02 20:41:45

标签: python pyspark rdd

学习bigdata和pyspark。

我有拥有

的RDD客户
[u'1,Richard,Hernandez,XXXXXXXXX,XXXXXXXXX,6303 Heather Plaza,Brownsville,TX,78521']

要获取客户编号和客户的名字+姓氏元组,我需要以下代码。

custname = customers.map(lambda x: (x.split(",")[8], x.split(",")[1] + " " +  x.split(",")[2]))

所以我的元组应该是(78521, (Richard Hernandez))

是否有更好的方法编写上述代码,即可以拆分3次,而不是拆分3次,并且可以将split的元素串联或类似?

2 个答案:

答案 0 :(得分:1)

使用 flatMap() +列表理解:

>>> customers.flatMap(lambda x: [ (e[8], e[1]+' '+e[2]) for e in [x.split(",")] ]).collect()
[(u'78521', u'Richard Hernandez')]

顺便说一句。您当然可以为您的任务编写一个函数:

def myfunc1(x):
    arr = x.split(',')
    return (arr[8], arr[1]+' '+arr[2])

customers.map(myfunc1).collect()
# [(u'78521', u'Richard Hernandez')]

或者:

def myfunc2(arr): return (arr[8], arr[1]+' '+arr[2])
customers.map(lambda x: myfunc2(x.split(','))).collect()

或者:

customers.map(lambda x: (lambda y: (y[8], y[1]+' '+y[2]))(x.split(','))).collect()

答案 1 :(得分:0)

您可以先分割客户,然后调用另一个地图以形成客户名称,如下所示:

customers_data = customers.map(lambda x: x.split(","))
custname = customers_data.map(lambda x: (x[8], x[1] + " " +  x[2]))