首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >访问空数组或空数组时引发错误

问访问空数组或空数组时引发错误
EN

Stack Overflow用户
提问于 2017-05-21 08:17:32
回答 2查看 3.7K关注 0票数 3

我有一个带有这种模式的JSON文件:

代码语言:javascript
复制
{
 "name" : "john doe",
 "phone-numbers" : {
   "home": ["1111", "222"],
   "country" : "England" 
  }
}

家庭电话号码数组有时可能是空的。

我的spark应用程序收到这些JSONS的列表,并执行以下操作:

代码语言:javascript
复制
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’是字符串类型。

如果该字段为空或空,是否有一种防止火花爆炸的优雅方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-05-21 11:57:43

问题不是空数组("home" : []),而是空数组("home" : null),它不适用于explode。

所以要么先过滤空值:

代码语言:javascript
复制
val result = df
   .filter($"phone-numbers.home".isNotNull)
   .select($"name", explode($"phone-numbers.home"))

或将空值替换为空数组(在您的情况下,我希望这样做):

代码语言:javascript
复制
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"))
票数 3
EN

Stack Overflow用户

发布于 2017-05-21 08:45:40

在spark中有一个名为DataFrameNaFunctions的类,这个类专门用于处理DataFrame中缺少的数据。

这个类包含三个基本方法:drop、replace和fill。

要使用这种方法,唯一需要做的就是调用df.na方法,为您的df返回一个DataFrameNaFunctions,然后应用三个方法中的一个,它用指定的操作返回您的df。

要解决您的问题,您可以使用这样的方法:

代码语言:javascript
复制
val dataframe = spark.read.json(filePaths: _*)
val result = dataframe.na.drop().select("name", 
                           explode(dataframe.col("phone-numbers.home")))

希望你能帮上忙,向你问好

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44094665

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档