Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 访问空数组或空数组时发生火花错误_Java_Json_Scala_Apache Spark - Fatal编程技术网

Java 访问空数组或空数组时发生火花错误

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($

我有一个JSON文件,具有这种模式:

{
 "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"))