Spark:如何将RDD转换为Seq以在管道中使用

时间:2015-06-19 10:57:37

标签: scala apache-spark pipeline rdd seq

我想在MLlib中使用管道的实现。以前,我有一个RDD文件并将其传递给模型创建,但现在要使用管道,应该有一系列的LabeledDocument传递给管道。

我的RDD创建如下:

val data = sc.textFile("/test.csv");
val parsedData = data.map { line =>
        val parts = line.split(',')
        LabeledPoint(parts(0).toDouble, Vectors.dense(parts.tail))
        }.cache()

在管道示例Spark Programming Guide中,管道需要以下数据:

// Prepare training documents, which are labeled.
val training = sparkContext.parallelize(Seq(
  LabeledDocument(0L, "a b c d e spark", 1.0),
  LabeledDocument(1L, "b d", 0.0),
  LabeledDocument(2L, "spark f g h", 1.0),
  LabeledDocument(3L, "hadoop mapreduce", 0.0),
  LabeledDocument(4L, "b spark who", 1.0),
  LabeledDocument(5L, "g d a y", 0.0),
  LabeledDocument(6L, "spark fly", 1.0),
  LabeledDocument(7L, "was mapreduce", 0.0),
  LabeledDocument(8L, "e spark program", 1.0),
  LabeledDocument(9L, "a e c l", 0.0),
  LabeledDocument(10L, "spark compile", 1.0),
  LabeledDocument(11L, "hadoop software", 0.0)))

我需要一种方法将我的RDD(parsedData)更改为LabeledDocuments序列(如示例中的培训)。

感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

我找到了这个问题的答案。

我可以通过以下代码将我的RDD(parsedData)转换为SchemaRDD,这是LabeledDocuments的序列:

val rddSchema = parsedData.toSchemaRDD;

现在问题发生了变化!我想将新的 rddSchema 分成训练(80%)和测试(20%)。如果我使用 randomSplit ,它将返回数组[RDD [Row]] 而不是 SchemaRDD

新问题:如何将数组[RDD [Row]] 转换为 SchemaRDD - 或者 - 如何拆分 SchemaRDD ,结果是 SchemaRDDs

答案 1 :(得分:0)

我试着在pyspark中关注 -

def myFunc(s):
    # words = s.split(",")
    s = re.sub("\"", "", s)
    words = [s for s in s.split(",")]
    val = words[0]
    lbl = 0.0
    if val == 4 or val == "4":
        lbl = 0.0
    elif val == 0 or val == "0":
        lbl = 1.0

    cleanlbl = cleanLine(words[5], True, val)
    # print "cleanlblcleanlbl ",cleanlbl
    return LabeledPoint(lbl, htf.transform(cleanlbl.split(" ")))


sparseList = sc.textFile("hdfs:///stats/training.1600000.processed.noemoticon.csv").map(myFunc)

sparseList.cache()  # Cache data since Logistic Regression is an iterative algorithm.


# for data in dataset:
trainfeats, testfeats = sparseList.randomSplit([0.8, 0.2], 10)

您可以在解析数据时拆分,您可以根据需要进行攻击和更改