在PySpark中将一个非常长的字符串转换为整数或Long Integer

时间:2016-08-16 16:12:11

标签: python python-2.7 apache-spark pyspark

我正在处理一个长度为38个字符的字符串列,实际上是数字。

例如id = '678868938393937838947477478778877 .....'(长38个字符)。

如何将其转换为长整数?我已经尝试使用IntegerType,LongType和DoubleType的强制转换函数,当我尝试显示列时,它会产生Null。

我想这样做的原因是因为我需要使用这个列进行一些内连接,并将其作为String给我带来Java堆空间错误。

有关如何将其强制转换为长整数的任何建议? {此问题试图将字符串转换为长整数}

1 个答案:

答案 0 :(得分:1)

长话短说,你根本就没有。 Spark DataFrame是一个JVM对象,它使用以下类型映射:

  • IntegerType - > Integer MAX_VALUE等于2 ** 31 - 1
  • LongType - > Long MaxValue等于2 ** 63 - 1

您可以尝试使用DecimalType最大允许精度(38)。

df = sc.parallelize([("9" * 38, "9" * 39)]).toDF(["x", "y"])
df.select(col("x").cast("decimal(38, 0)")).show(1, False)

## +--------------------------------------+
## |x                                     |
## +--------------------------------------+
## |99999999999999999999999999999999999999|
## +---------------------------------------

使用较大的数字,您可以强制转换为双倍但不会没有精度损失:

df.select(
    col("y").cast("decimal(38, 0)"), col("y").cast("double")).show(1, False)

## +----+------+
## |y   |y     |
## +----+------+
## |null|1.0E39|
## +----+------+

据说铸造数字类型不会帮助你解决内存错误。