Java 访问空数组或空数组时发生火花错误
我有一个JSON文件,具有这种模式:Java 访问空数组或空数组时发生火花错误,java,json,scala,apache-spark,Java,Json,Scala,Apache Spark,我有一个JSON文件,具有这种模式: { "name" : "john doe", "phone-numbers" : { "home": ["1111", "222"], "country" : "England" } } 家庭电话号码数组有时可能为空 我的spark应用程序接收这些JSON的列表,并执行以下操作: val dataframe = spark.read.json(filePaths: _*) val result = dataframe.select($
{
"name" : "john doe",
"phone-numbers" : {
"home": ["1111", "222"],
"country" : "England"
}
}
家庭电话号码数组有时可能为空
我的spark应用程序接收这些JSON的列表,并执行以下操作:
val dataframe = spark.read.json(filePaths: _*)
val result = dataframe.select($"name",
explode(dataframe.col("phone-numbers.home")))
当“主”数组为空时,我在尝试分解它时收到以下错误:
org.apache.spark.sql.AnalysisException:无法解析
“电话号码”
['home']”由于数据类型不匹配:参数2
需要整数类型,但“home”是字符串类型
如果这个区域是空的或是空的,有没有一种优雅的方法来防止火花爆炸 在spark中有一个名为的类,该类专门用于处理
DataFrame
s中缺少的数据
该类包含三个基本方法:删除
、替换
和填充
要使用此方法,您唯一需要做的就是调用df.na
方法,该方法为df
返回一个DataFrameNaFunctions
,然后应用三个方法中的一个,该方法返回带有指定操作的df
要解决您的问题,您可以使用以下方法:
val dataframe = spark.read.json(filePaths: _*)
val result = dataframe.na.drop().select("name",
explode(dataframe.col("phone-numbers.home")))
希望您能提供帮助,敬请谅解。问题不在于空数组(
“home”:[]
),而在于空数组(“home”:null
)无法使用分解
因此,要么先过滤空值:
val result = df
.filter($"phone-numbers.home".isNotNull)
.select($"name", explode($"phone-numbers.home"))
或者用空数组替换空值(在您的情况下我更喜欢):
Spark版本是什么?没有家庭号码或家庭号码为空,您希望得到什么?
val nullToEmptyArr = udf(
(arr:Array[Long]) => if(arr==null) Array.empty[Long] else arr
)
val result = df
.withColumn("phone-numbers.home",nullToEmptyArr($"phone-numbers.home")) // clean existing column
.select($"name", explode($"phone-numbers.home"))