hive on spark执行任务报错

报错信息:
Job failed with org.codehaus.jackson.JsonParseException: Current token (VALUE_STRING) not numeric, can not use numeric value accessors
FAILED: Execution Error, return code 3 from org.apache.hadoop.hive.ql.exec.spark.SparkTask. Spark job failed during runtime. Please check stacktrace for the root cause.
不知道can not use numeric value accessors怎么改?好像模拟数据有问题

img

检查下你的hive表的定义和json数据是否有问题和一致,比如表中定义的是数字类型的,但是操作数据缺失字符串类型的。

我看报错信息中提到了org.codehaus.jackson.JsonParseException:
第一种可能是由于JSON格式错误导致的,您可以尝试检查您的代码中是否存在JSON格式错误,并确保所有数字都被正确解析。
第二种情况是该错误还可能与Spark版本不兼容有关,您可以尝试升级或降级Spark版本以解决此问题。

根据报错信息,可以看出是因为解析JSON字符串时出现了问题,导致无法使用数字值访问器。这可能是由于JSON字符串格式不正确或包含非数字字符而导致的。

为了解决这个问题,你可以尝试以下几个步骤:

检查数据源:首先,检查数据源文件是否正确,确保JSON字符串格式正确且不包含非数字字符。

调整数据类型:尝试将数据源文件中的字符串类型转换为数字类型。你可以使用Hive内置函数,如CAST()或CONVERT()等函数进行转换。

使用JSON格式化工具:如果你使用的是手动创建的JSON字符串,你可以使用在线JSON格式化工具,如JSONLint等,验证和格式化JSON字符串。

检查Spark版本:确保您使用的Spark版本与Hive兼容,并且已正确配置。

好像是你sql写错了,你该把代码占出来


这个错误是因为hive的map join参数默认是开启的:
hive.auto.convert.join=true
方法
 可以关闭上面的map join 改为common join
shell命令行:set hive.auto.convert.join=false

2、修改配置文件下的参数可以把map join 关闭,使用common join
hive_conf.xml

<property>
<name>hive.auto.convert.join</name>
<value>false</value>//true修改为false
<description>Enables the optimization about converting common join into mapjoin</description>
</property>

根据报错信息来看,当前的 token 类型是 VALUE_STRING,而数值类型的访问器不能使用字符串值,因此需要先将字符串值转换为数值类型,然后再使用对应的访问器。可以尝试使用 CAST 函数进行转换,例如:

SELECT CAST(your_column_name AS float) FROM your_table_name;

your_column_name 替换为需要转换的列名,your_table_name 替换为需要查询的表名。

这个错误信息表明在处理数据时遇到了问题,具体来说是在尝试访问一个非数字值的情况下发生了错误。根据提供的信息,可能是由于模拟数据的问题导致的。

由于您提供的信息太少,此处引入GPT的解答:
报错信息中的"Current token (VALUE_STRING) not numeric, can not use numeric value accessors"指示当前令牌为字符串值,无法使用数字值访问器。这通常表示在执行Hive on Spark任务时,存在一个预期为数字的值实际上是字符串格式的问题。
要解决这个问题,您可以采取以下步骤:
检查Hive查询或Spark作业中使用的输入数据,确保相应的字段或参数的值确实是数字,而不是字符串。这可能涉及到检查您的数据源、表定义或输入参数的设置。
确保在Hive表的定义中,相关字段的数据类型正确地指定为数字类型(例如,INT、FLOAT、DOUBLE等),而不是字符串类型(如STRING)。
如果您的查询或作业中使用了UDF(用户定义函数),请确保您的自定义函数能够正确地处理字符串和数字之间的转换。如果需要,可以根据需要调整您的UDF实现。
如果您的查询或作业中包含表达式或计算逻辑,涉及将字符串转换为数字类型,请确保使用适当的函数(如CAST函数)进行显式转换。
例如,如果您的查询中有一个字符串字段需要进行数字计算,您可以使用CAST函数将其转换为数字类型,如下所示:
SELECT CAST(string_column AS INT) + 10 FROM your_table;
请根据您的具体情况和查询逻辑,检查和修改相关代码中的数据类型和转换,以确保将字符串正确地转换为数字类型。这应该能够解决"can not use numeric value accessors"错误。

该回答引用GPT与博主@晓码自在合作编写:

这个错误是由于JSON字符串中存在非数字值,但是代码试图使用数字访问符来访问这个值导致的。例如:

json
{"age": "String"}

如果代码像这样访问age字段:

python
age = json_data["age"] + 10  # age是字符串,不能相加

就会抛出这个错误,因为age字段是一个字符串,不能使用数字访问符(+)。

解决方法是:

  1. 在访问该字段之前进行类型检查,如果是字符串则不进行数字操作:
python
age = json_data["age"]
if isinstance(age, int):
    age += 10
else:
    print("age is not a number!")

  1. 尝试使用int()将字符串转换为整数,如果失败则捕获异常:
python 
try:
    age = int(json_data["age"]) + 10
except ValueError:
    print("age is not a number!")

  1. 在JSON加载时就指定数字字段的类型为int,字符串的类型为str,那么代码中就不会产生混淆:
python
import json

json_data = json.loads(some_string, parse_int=int, parse_float=float)
age = json_data["age"] + 10 # 这里age就是int类型了

所以,根据报错信息,我的推荐解决方案是:

  1. 检查您的JSON数据,找到非数字值的字段
  2. 在访问这些字段前先进行类型检查和转换为数字,避免产生这个错误
  3. 如果在JSON加载时就能确定字段类型,最好指定解析类型,会避免代码中类型的混淆和错误

该回答参考ChatGPT:
这个错误信息表明在读取JSON字符串时,遇到了一个不能用于数字访问的“VALUE_STRING”节点。这可能是因为JSON字符串中包含了一个不能转换为数字的字符串。
解决这个问题的一种方法是确保JSON字符串中所有的值都是可以转换为数字的。您可以使用JSON库中的JSON.parseObject方法来将JSON字符串转换为Java对象,并检查转换是否成功。例如:

String jsonString = "{\"name\":\"John\",\"age\":30,\"city\":\"New York\"}";
ObjectMapper objectMapper = new ObjectMapper();
MyObject myObject = objectMapper.readValue(jsonString, MyObject.class);
if (myObject.getName().equals("John") && myObject.getAge() == 30 && myObject.getCity().equals("New York")) {
    // JSON parsing successful
} else {
    // JSON parsing failed
}

另一种解决方法是使用第三方JSON库,例如Jackson、Gson或Fastjson,它们提供了更好的数字字符串解析功能。

以下答案由GPT-3.5大模型与博主波罗歌共同编写:
根据错误信息来看,出现了JsonParseException,并提示Current token (VALUE_STRING) not numeric, can not use numeric value accessors。这个错误通常是因为JSON数据格式不合法,导致无法将相应的值转换为数字类型。

解决办法如下:

1.检查输入的数据是否是合法的JSON格式。可以使用一些在线的JSON格式校验工具,比如JSON 校验器(https://www.bejson.com/jsoneditoronline/