我正在尝试使用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
方法中使用嵌套列的任何建议吗?
非常感谢!
答案 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)
希望答案有用