簡體   English   中英

Spark SQL - java.lang.UnsupportedOperationException: 轉換列時為 empty.init

[英]Spark SQL - java.lang.UnsupportedOperationException: empty.init when casting column

嘗試對列執行強制轉換時出現以下錯誤(從帶有標題的逗號分隔的 csv 文件中讀取)。

這是我正在使用的代碼:

var df = spark.read.option("header","true").option("delimiter",",").csv("/user/sample/data")
df.withColumn("columnCast", expr("CAST(SaleAmount) AS LONG")).count

這會導致每次拋出以下異常。 我在投射時嘗試了不同的列,有些則拋出,而另一些則沒有。 我也試過以下也拋出相同的異常。

df.withColumn("columnCast", expr("CAST(NULL) AS LONG")).count

java.lang.UnsupportedOperationException: 在 scala.collection.TraversableLike$class.init(TraversableLike.scala:451) 在 scala.collection.mutable.ArrayOps$ofInt.scala$collection$IndexedSeqOptimized$$super$init(ArrayOps. scala:234) at scala.collection.IndexedSeqOptimized$class.init(IndexedSeqOptimized.scala:135) at scala.collection.mutable.ArrayOps$ofInt.init(ArrayOps.scala:234) at org.apache.spark.sql.catalyst .analysis.FunctionRegistry$$anonfun$7$$anonfun$11.apply(FunctionRegistry.scala:565) 在 org.apache.spark.sql.catalyst.analysis.FunctionRegistry$$anonfun$7$$anonfun$11.apply(FunctionRegistry.scala:565) [558] 第558話

我試過在 spark-shell 和 zeppelin 中運行它。 Spark 版本是 Cloudera 管理的 2.4.0.cloudera2。

是什么導致了這種行為? 這是故意的嗎? 我該如何處理?

您可以使用 column 的 cast 方法進行轉換:

import spark.implicits._

val df = spark.sparkContext.parallelize(1 to 10).toDF("col1")
val casted = df.withColumn("test", lit(null).cast("string"))
               .withColumn("testCast", $"test".cast("long"))
casted.show()
casted.printSchema()

結果:

+----+----+--------+
|col1|test|testCast|
+----+----+--------+
|   1|null|    null|
|   2|null|    null|
|   3|null|    null|
|   4|null|    null|
|   5|null|    null|
|   6|null|    null|
|   7|null|    null|
|   8|null|    null|
|   9|null|    null|
|  10|null|    null|
+----+----+--------+

root
 |-- col1: integer (nullable = false)
 |-- test: string (nullable = true)
 |-- testCast: long (nullable = true)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM