将DataFrame与MLlib一起使用

kev*_*kuo 12 apache-spark apache-spark-mllib

假设我有一个DataFrame(我从HDFS上的csv读入),我想通过MLlib训练一些算法.如何将行转换为LabeledPoints或以其他方式在此数据集上使用MLlib?

Spi*_*lov 6

假设您正在使用Scala:

假设你获得DataFrame如下:

val results : DataFrame = sqlContext.sql(...)
Run Code Online (Sandbox Code Playgroud)

第1步:调用results.printSchema()- 这不仅会显示DataFrame中的列和(这很重要)它们的顺序,还会显示Spark SQL认为它们的类型.一旦你看到这个输出,事情变得不那么神秘了.

第2步:获取一个RDD[Row]出来的DataFrame:

val rows: RDD[Row] = results.rdd
Run Code Online (Sandbox Code Playgroud)

第3步:现在只需要从各行中提取您感兴趣的任何字段.为此,您需要知道每个字段的基于0的位置及其类型,幸运的是,您在上面的步骤1中获得了所有这些.例如,假设你做了一个SELECT x, y, z, w FROM ...并打印出了架构

root
|-- x double (nullable = ...)
|-- y string (nullable = ...)
|-- z integer (nullable = ...)
|-- w binary (nullable = ...)
Run Code Online (Sandbox Code Playgroud)

而假设你想使用xz.您可以将它们拉出来RDD[(Double, Integer)],如下所示:

rows.map(row => {
    // x has position 0 and type double
    // z has position 2 and type integer
    (row.getDouble(0), row.getInt(2))
})
Run Code Online (Sandbox Code Playgroud)

从这里开始,您只需使用Core Spark来创建相关的MLlib对象.如果您的SQL返回数组类型的列,事情可能会变得更复杂,在这种情况下,您将不得不调用getList(...)该列.