我有一个带有这种模式的JSON文件:
{
"name" : "john doe",
"phone-numbers" : {
"home": ["1111", "222"],
"country" : "England"
}
}家庭电话号码数组有时可能是空的。
我的spark应用程序收到这些JSONS的列表,并执行以下操作:
val dataframe = spark.read.json(filePaths: _*)
val result = dataframe.select($"name",
explode(dataframe.col("phone-numbers.home")))当“home”数组为空时,当我试图引爆它时,会收到以下错误:
org.apache.spark.sql.AnalysisException:由于数据类型不匹配,无法解决‘
phone-numbers’home:参数2需要整型,但是‘home’是字符串类型。
如果该字段为空或空,是否有一种防止火花爆炸的优雅方法?
发布于 2017-05-21 11:57:43
问题不是空数组("home" : []),而是空数组("home" : null),它不适用于explode。
所以要么先过滤空值:
val result = df
.filter($"phone-numbers.home".isNotNull)
.select($"name", explode($"phone-numbers.home"))或将空值替换为空数组(在您的情况下,我希望这样做):
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"))发布于 2017-05-21 08:45:40
在spark中有一个名为DataFrameNaFunctions的类,这个类专门用于处理DataFrame中缺少的数据。
这个类包含三个基本方法:drop、replace和fill。
要使用这种方法,唯一需要做的就是调用df.na方法,为您的df返回一个DataFrameNaFunctions,然后应用三个方法中的一个,它用指定的操作返回您的df。
要解决您的问题,您可以使用这样的方法:
val dataframe = spark.read.json(filePaths: _*)
val result = dataframe.na.drop().select("name",
explode(dataframe.col("phone-numbers.home")))希望你能帮上忙,向你问好
https://stackoverflow.com/questions/44094665
复制相似问题