大多数spark的数据集功能都是每行操作。但是,我想分发ML任务的执行以在Spark上运行 - 大多数ML任务自然是表的功能操作,而不是行的自然功能。 (我看过MLLib - 它的方式太有限了,在很多情况下,通过在许多核心上进行分布操作,可以使执行速度降低几个数量级,而这些核心可以放在单个核心上。)
ML算法处理行集合而非单行集合非常重要,因此我想将表格实现到节点上的内存中。 (我小指承诺它将适合核心)。我怎么能这样做?
从功能上讲,我想这样做:
def mlsubtask(table, arg2, arg3):
data = table.collect()
...
sc = SparkContext(...)
sqlctx = SQLContext(sc)
...
df = sqlctx.sql("SELECT ...")
results = sc.parallelize([(df,arg2,arg3),(df,arg2,arg3),(df,arg2,arg3)]).map(mlsubtask).collect()
如果可以执行如下执行:
sc = SparkContext(...)
sqlctx = SQLContext(sc)
...
df = sqlctx.sql("SELECT ...")
df = df.collect()
results = sc.parallelize([(df,arg2,arg3),(df,arg2,arg3),(df,arg2,arg3)]).map(mlsubtask).collect()
...但是这会将数据带到客户端,然后重新序列化并且非常低效。
答案 0 :(得分:0)
对于单个任务:
def mlsubtask(iter_rows):
data_table = list(iter_rows) # Or other way of bringing into memory.
...
df.repartition(1).mapPartitions(mlsubtask)