[英]pyspark rdd.map function takes 3 minutes to run on 32 rows
[英]RDD.map and a function with nested imports
我有一個將字符串轉換為特定類型的方法。 數據是從csv文件讀取的,並用於創建rdd。 為了使此功能正常工作,我必須將import語句放入功能定義中。 這意味着在每次調用函數時執行這些行。 導入的程序包必須存在於群集節點上,否則該功能將不起作用。 是否可以將導入內容從方法中移出並仍然引用它們? 如果是這樣,怎么辦?
def convertType(v, ftype, fmt = '%Y-%m-%d %H:%M:%S %Z', nodate = '1900-01-01 0:00:00: GMT', empty2None = False):
import datetime
import decimal
v = v.strip() # clean up the string
if empty2None:
if v == "": # do we have an empty string?
return None
ftypes = { 'null': 'None', \
'date': 'datetime.date(int(v))', \
'timestamp': 'datetime.datetime.strptime(v if not (v == "") else nodate, fmt)', \
'binary': 'bytearray(v)', \
'integer': 'int(v)', \
'boolean': 'bool(v)', \
'long': 'long(v)', \
'double': 'float(v)', \
'float': 'float(v)', \
'short': 'int(v)', \
'byte': 'int(v)', \
'string': 'str(v)', \
'decimal': 'decimal.Decimal(v)' \
}
return eval(ftypes[ftype.lower()])
data = raw.map(lambda p: [convertType(p[0][i], typeparts[i], fmt, nodate, True) for i in indx]) # convert split text to data rows
為了最大程度地減少導入開銷,您可以嘗試使用mapPartitions 。 然后,每個分區(而不是每一行)導入一次。
def convertPartitionType(elements):
import ...
return [convertType(x) for x in elements]
當然,convertType不會導入任何內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.