访问变换器setInputCol()方法中的嵌套列

时间:2017-08-02 09:38:02

标签: scala apache-spark apache-spark-mllib databricks

我正在尝试使用Databricks XML解析器和Spark的管道方法解析Wikipedia转储。目标是为文本字段计算特征向量,这是一个嵌套列。

XML的架构如下:

root
|-- id: long (nullable = true)
|-- ns: long (nullable = true)
|-- revision: struct (nullable = true)
|    |-- comment: string (nullable = true)
|    |-- contributor: struct (nullable = true)
|    |    |-- id: long (nullable = true)
|    |    |-- ip: string (nullable = true)
|    |    |-- username: string (nullable = true)
|    |-- format: string (nullable = true)
|    |-- id: long (nullable = true)
|    |-- minor: string (nullable = true)
|    |-- model: string (nullable = true)
|    |-- parentid: long (nullable = true)
|    |-- sha1: string (nullable = true)
|    |-- text: struct (nullable = true)
|    |    |-- _VALUE: string (nullable = true)
|    |    |-- _bytes: long (nullable = true)
|    |    |-- _space: string (nullable = true)
|    |-- timestamp: string (nullable = true)
|-- title: string (nullable = true)

读取转储后
val raw = spark.read.format("com.databricks.spark.xml").option("rowTag", "page").load("some.xml")

我可以使用

访问相应的文本
raw.select("revision.text._VALUE").show(10)

然后我作为Spark管道中的第一个阶段RegexTokenizer,需要访问revision.text._VALUE才能转换数据:

val tokenizer = new RegexTokenizer().
    setInputCol("revision.text._VALUE").
    setOutputCol("tokens").
    setMinTokenLength(3).
    setPattern("\\s+|\\/|_|-").
    setToLowercase(true)
val pipeline = new Pipeline().setStages(Array(tokenizer))
val model = pipeline.fit(raw)

但是,此步骤失败了:

Name: java.lang.IllegalArgumentException
Message: Field "revision.text._VALUE" does not exist.

有关如何在setInputCol方法中使用嵌套列的任何建议吗?

非常感谢!

1 个答案:

答案 0 :(得分:1)

尝试在temp中使用

之前创建RegexTokenizer
val rawTemp = raw.withColumn("temp", $"revision.text._VALUE")

然后,您可以使用rawTemp中的temp数据框和RegexTokenizer列作为

val tokenizer = new RegexTokenizer().
    setInputCol("temp").
    setOutputCol("tokens").
    setMinTokenLength(3).
    setPattern("\\s+|\\/|_|-").
    setToLowercase(true)
val pipeline = new Pipeline().setStages(Array(tokenizer))
val model = pipeline.fit(rawTemp)

希望答案有用