我有以下代码。我正在使用pyspark 1.2.1和python 2.7(cpython)
for colname in shuffle_columns:
colrdd = hive_context.sql('select %s from %s' % (colname, temp_table))
# zip_with_random_index is expensive
colwidx = zip_with_random_index(colrdd).map(merge_index_on_row)
(hive_context.applySchema(colwidx, a_schema)
.registerTempTable(a_name))
关于此代码的事情是它一次只能在一列上运行。我的群集中有足够的节点,我可以同时在多个列上运行。 有没有办法在spark中执行此操作?如果我使用了线程之类的东西怎么办?我可以以这种方式并行启动多个registerTempTable
(以及相关的集合操作)吗? / p>
答案 0 :(得分:1)
不幸的是,下面的效果不好。它的工作原理是所有单独的迭代都会执行。不幸的是,由于空指针异常,后续对hive_context
对象的调用失败。
这可以通过concurrent.futures
:
from concurrent import futures
def make_col_temptable(colname):
colrdd = hive_context.sql('select %s from %s' % (colname, temp_table))
# zip_with_random_index is expensive
colwidx = zip_with_random_index(colrdd).map(merge_index_on_row)
(hive_context.applySchema(colwidx, a_schema)
.registerTempTable(a_name))
with futures.ThreadPoolExecutor(max_workers=20) as executor:
futures.wait([executor.submit(make_col_temptable, colname) for colname in shuffle_columns])