如何将Hive表转换为MLlib LabeledPoint?

时间:2016-02-23 18:51:19

标签: hadoop apache-spark hive pyspark apache-spark-mllib

我使用Impala构建了一个包含目标和数百个功能的表。 我想使用Spark MLlib训练模型。 据我所知,为了通过Spark运行分布式监督模型,数据需要采用多种格式之一。 LabeledPoint对我来说似乎最直观。 使用PySpark将Hive表转换为Labeled Points的最有效方法是什么?

1 个答案:

答案 0 :(得分:3)

这个问题的最佳解决方案是使用ml库及其模型,因为它们直接作用于数据帧。

http://spark.apache.org/docs/latest/api/python/pyspark.ml.html?highlight=ml#module-pyspark.ml.classification

然而,ml api还没有达到mllib的功能奇偶性,你需要的东西可能会丢失。因此,我们通过在hive上下文检索的数据帧上调用地图来解决工作流中的这个问题。

from pyspark import SparkContext, HiveContext
from pyspark.mllib.regression import LabeledPoint
from pyspark.mllib.classification import LogisticRegressionWithLBFGS

table_name = "MyTable"
target_col = "MyTargetCol"

sc = SparkContext()
hc = HiveContext(sc)

# get the table from the hive context
df = hc.table(table_name) 

# reorder columns so that we know the index of the target column
df = df.select(target_col, *[col for col in dataframe.columns if col != target_col])

# map through the data to produce an rdd of labeled points
rdd_of_labeled_points = df.map(lambda row: LabeledPoint(row[0], row[1:]))

# use the rdd as input to a model
model = LogisticRegressionWithLBFGS.train(rdd_of_labeled_points)

请记住,无论何时使用python进行映射,数据都需要从JVM到Python VM进行编组,因此性能会受到影响。我们发现使用地图所带来的性能对我们的数据来说可以忽略不计,但您的里程可能会有所不同。