RDD.map和嵌套导入的函数

时间:2016-03-08 14:11:07

标签: pyspark

我有一个将字符串转换为特定类型的方法。数据从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

1 个答案:

答案 0 :(得分:1)

为了最大限度地减少导入开销,您可以尝试使用mapPartitions。然后,您将为每个分区导入一次(不是每行)。

def convertPartitionType(elements):
  import ...
  return [convertType(x) for x in elements]

当然,convertType不会导入任何内容。