【发布时间】:2016-05-31 18:25:48
【问题描述】:
我有一个带有 Seq[(String, String, String)] 行的 spark DF。我正在尝试对此进行某种flatMap,但我所做的任何尝试最终都会抛出
java.lang.ClassCastException:org.apache.spark.sql.catalyst.expressions.GenericRowWithSchema 无法转换为 scala.Tuple3
我可以从 DF 中取出单行或多行
df.map{ r => r.getSeq[Feature](1)}.first
返回
Seq[(String, String, String)] = WrappedArray([ancient,jj,o], [olympia_greece,nn,location] .....
并且 RDD 的数据类型似乎是正确的。
org.apache.spark.rdd.RDD[Seq[(String, String, String)]]
df 的架构是
root
|-- article_id: long (nullable = true)
|-- content_processed: array (nullable = true)
| |-- element: struct (containsNull = true)
| | |-- lemma: string (nullable = true)
| | |-- pos_tag: string (nullable = true)
| | |-- ne_tag: string (nullable = true)
我知道这个问题与 spark sql 将 RDD 行视为org.apache.spark.sql.Row 有关,即使他们愚蠢地说这是Seq[(String, String, String)]。有一个相关的问题(下面的链接),但该问题的答案对我不起作用。我对 spark 还不够熟悉,无法弄清楚如何将其转变为可行的解决方案。
这些行是Row[Seq[(String, String, String)]] 还是Row[(String, String, String)] 还是Seq[Row[(String, String, String)]] 或者更疯狂的东西。
我正在尝试做类似的事情
df.map{ r => r.getSeq[Feature](1)}.map(_(1)._1)
看似有效,但实际上无效
df.map{ r => r.getSeq[Feature](1)}.map(_(1)._1).first
抛出上述错误。那么我应该如何(例如)获取每行第二个元组的第一个元素?
另外为什么已经设计了 spark 来做到这一点,声称某物是一种类型而实际上它不是并且不能转换为声称的类型似乎是愚蠢的。 p>
相关问题:GenericRowWithSchema exception in casting ArrayBuffer to HashSet in DataFrame to RDD from Hive table
【问题讨论】:
-
请问谁否决了这个问题以及为什么?
-
相关的错误报告是我的解决方案
标签: scala apache-spark dataframe apache-spark-sql