Apache Spark - 从Dataframe中的Row中选择一些未修改的字段

时间:2017-10-10 18:55:23

标签: apache-spark spark-dataframe

我有

org.apache.spark.sql.DataFrame = [ts: string, name: string, value: string ]

我正在尝试

val result = df.map {case Row(ts, name, value) => (name+":"+value+"-ctag", ts)}

结果中基本上第二个字​​段未经修改。但是我收到了这个错误:

java.lang.ClassNotFoundException: scala.Any
  at scala.reflect.internal.util.AbstractFileClassLoader.findClass(AbstractFileClassLoader.scala:62)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
  at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
  at java.lang.Class.forName0(Native Method)
  at java.lang.Class.forName(Class.java:348)
  at scala.reflect.runtime.JavaMirrors$JavaMirror.javaClass(JavaMirrors.scala:555)
  at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$classToJava$1.apply(JavaMirrors.scala:1211)
  at scala.reflect.runtime.JavaMirrors$JavaMirror$$anonfun$classToJava$1.apply(JavaMirrors.scala:1203)
  at scala.reflect.runtime.TwoWayCaches$TwoWayCache$$anonfun$toJava$1.apply(TwoWayCaches.scala:49)

如果我不按原样选择第二个字段,但应用下面的转换

val result = df.map {case Row(ts, name, value) => (name+":"+value+"-ctag", ts+"test")}

它没有任何问题。

你能解释一下这个错误在说什么吗?我想在某些领域应用转换,而不是在其他一些领域。

1 个答案:

答案 0 :(得分:0)

如果您在Row上进行模式匹配,则所有变量都为Any类型。如果您将AnyString连接起来,则结果为String(在第二个示例中就是这种情况)。

请改为尝试:

val result = df.map {case Row(ts:String, name:String, value:String) => (name+":"+value+"-ctag", ts)}