当前位置: 首页 > 知识库问答 >
问题:

访问空数组或空数组时发生Spark错误

商璞
2023-03-14

我有一个具有这种模式的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")))

当“home”数组为空时,我在尝试爆炸它时收到以下错误:

组织。阿帕奇。火花sql。AnalysisException:由于数据类型不匹配,无法解析“电话号码”[“home]”:参数2需要整数类型,但“home”是字符串类型。;;

如果这个场是空的或是空的,有没有一种优雅的方法来防止火花爆炸?

共有2个答案

赖星驰
2023-03-14
匿名用户

在火花中有一个名为DataFrameNaFunctions的类,该类专门用于处理DataFrames中丢失的数据。

此类包含三个基本方法:删除替换填充

要使用这种方法,您唯一要做的就是调用df。na方法,该方法为您的df返回一个数据帧函数,然后应用三种方法中的一种,该方法使用指定的操作返回您的df。

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

val dataframe = spark.read.json(filePaths: _*)
val result = dataframe.na.drop().select("name", 
                           explode(dataframe.col("phone-numbers.home")))

希望这能帮上忙,问候

经骁
2023-03-14

问题不在于空数组(“home”:[]而是空数组(“home”:null),它们不能与分解一起工作

因此,要么先过滤空值:

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

 类似资料:
  • 问题内容: 我有以下代码: 接收脚本(block_ajax.php)仅接收“ action”和“ listid”参数。当我检查使用Chrome发送的内容时,我发现“ layout”参数甚至没有发送到后端脚本。 由于空数组与缺少数组之间存在差异,因此我想让JQuery发送空数组。我发现一些迹象表明JQuery(1.6.1)似乎可以做到这一点,但没有办法阻止它这样做。JSON格式允许使用空数组和空对象

  • 问题内容: 如果未初始化int数组的各个元素,则默认情况下存储在其中的内容是什么?我显然发现其中有一个空数组或空数组。有什么区别,哪一个适用于我的第一个问题? 问题答案: 从技术上讲,没有 null数组 之类的东西;但是由于数组是对象,所以数组类型是引用类型(即:数组变量仅保存对数组的 引用 ),这意味着数组变量可以而不是实际指向数组: 一个 空 数组是零长度的阵列; 它没有元素: (并且 永远不

  • 问题内容: 我正在继续我的上学项目,似乎遇到了另一个错误。所以发生的事情基本上是我收到一个空指针异常,即使代码看起来很好。我相信我的阵列出了点问题,即使经过数小时的搜索,我似乎也找不到该错误。再一次,任何帮助/解决方案将不胜感激。 } 我有一个带有构造函数的学生班,并且有一个说明 但仍然出现错误。我知道要处理的代码很多,因此再次感谢任何帮助。 问题答案: 由于您的代码是当前编写的, 由于您永远不会

  • 问题内容: 我正在使用jQuery将表单发布到php文件,这是用于验证用户详细信息的简单脚本。 PHP代码: 我看一下萤火虫中的响应,它是一个空数组。该数组应至少具有一些值。 我无法弄清楚为什么在php文件中不起作用。Firebug显示该帖子包含发布的内容,电子邮件和发票ID,而在php文件中实际上什么也没收到。 表格: 有人知道它在做什么吗? 谢谢 找到了这个-http://www.bradin

  • 为了测试一个程序,我编写了以下语句:

  • 问题内容: 我的日志显示此异常:由以下代码触发: 我试图弄清楚String.split返回空数组的条件。我的理解是,如果找不到匹配项,则返回大小为1且与原始字符串匹配的数组。 这是为Android build SDK版本21编译的Java。我期待听到我遗漏的明显细节。 问题答案: 返回结果的地方是。现在根据文档(限制由表示) 如果为零,则将尽可能多地应用该模式,该数组可以具有任何长度,并且 尾随的