我有一个将字符串转换为特定类型的方法。数据从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
答案 0 :(得分:1)
为了最大限度地减少导入开销,您可以尝试使用mapPartitions。然后,您将为每个分区导入一次(不是每行)。
def convertPartitionType(elements):
import ...
return [convertType(x) for x in elements]
当然,convertType不会导入任何内容。