Java Integer,Python int和系统最大整数值

问题

在使用pyspark运行Spark ALS算法时,发生以下问题:

java.lang.IllegalArgumentException: ALS only supports values in Integer range and without fractional part for columns userId and softId. Value 13466056057 was either out of Integer range or contained a fractional part that could not be converted.

分析

输出信息提示,13466056057超出Integer类型范围,或者是一个小数。很明显,13466056057不是一个小数,那就是说超出了Integer类型范围。

Java Integer取值范围是:[-2147483648, 2147483647]

获取方式:Integer.MAX_VALUEInteger.MIN_VALUE

解决

这个是数据ETL逻辑缺陷导致的,ETL逻辑是用Python写的,增加符合Java Integer类型的合法性检查即可。而对于现有的ETL之后的数据进行一次清理,将不合法的记录删除,重新运行任务。

其他

经过测试,在Python中,int类型的数据貌似是没有范围限制的,这个以前倒是没有注意过。

另外sys.maxsize是系统的整数最大值,64位系统中,输出如下:

>>> import sys
>>> print(sys.maxsize)
9223372036854775807

实测Python int转换:

>>> print(int('92233720368547758070'))
92233720368547758070
>>> print(int('922337203685477580700'))
922337203685477580700
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 好的,这是一个算法问题,可以通过编写代码来解决。以下是一个可以求解最大和次大Python 代码示例: ``` nums = [] # 存储输入的整数 # 输入10个整数 for i in range(10): num = int(input("请输入第%d个整数:" % (i+1))) nums.append(num) # 求最大和次大 max_num = max(nums) nums.remove(max_num) second_max_num = max(nums) print("最大为:%d,次大为:%d" % (max_num, second_max_num)) ``` 希望能帮到您。 ### 回答2: 假设使用C++语言编写程序,可以通过以下代码实现从键盘上输入10个整数,并求出其中的最大和次大。 ```c++ #include <iostream> using namespace std; int main() { int numbers[10]; cout << "请输入10个整数:" << endl; // 从键盘上输入10个整数 for (int i = 0; i < 10; i++) { cin >> numbers[i]; } int maxNum = numbers[0]; // 初始化最大 int secondMaxNum = numbers[0]; // 初始化次大 // 求最大和次大 for (int i = 1; i < 10; i++) { if (numbers[i] > maxNum) { secondMaxNum = maxNum; maxNum = numbers[i]; } else if (numbers[i] > secondMaxNum) { secondMaxNum = numbers[i]; } } cout << "最大为:" << maxNum << endl; cout << "次大为:" << secondMaxNum << endl; return 0; } ``` 这段代码首先声明一个长度为10的整数数组`numbers[10]`,然后通过`cin`语句从键盘上接受10个整数的输入,并存储在数组中。接下来,使用两个变量`maxNum`和`secondMaxNum`分别初始化为数组的第一个元素,然后遍历数组,比较每个元素与`maxNum`和`secondMaxNum`的大小关系,更新最大和次大。最后,使用`cout`语句输出最大和次大。 ### 回答3: 首先,我们需要声明一个长度为10的数组来存储输入的10个整数。然后,我们可以使用一个循环来从键盘上输入这10个整数,并将它们存储在数组中。 接下来,我们可以假设数组的第一个元素是最大(即当前已知的最大),而第二个元素是次大(即当前已知的次大)。然后,我们可以遍历数组并将每个元素与当前的最大和次大作比较,以更新最大和次大。 具体的代码如下所示: ``` import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int[] numbers = new int[10]; int max = Integer.MIN_VALUE; // 初始化最大为最小整数 int secondMax = Integer.MIN_VALUE; // 初始化次大为最小整数 System.out.println("请输入10个整数:"); for (int i = 0; i < numbers.length; i++) { numbers[i] = scanner.nextInt(); if (numbers[i] > max) { secondMax = max; // 更新次大为旧的最大 max = numbers[i]; // 更新最大为当前 } else if (numbers[i] > secondMax && numbers[i] < max) { secondMax = numbers[i]; // 更新次大为当前 } } System.out.println("最大为:" + max); System.out.println("次大为:" + secondMax); } } ``` 当程序运行时,它会提示用户输入10个整数。然后,它会在遍历完所有输入的整数后输出最大和次大。 请注意,如果用户输入的整数少于10个,或者输入的不是整数,那么程序可能无法正常运行。为了保证程序的健壮性,我们可以在读取输入之前添加一些错误处理的代码,例如检查用户输入的整数个数是否正确。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值