我正在使用带有python的spark。上传一个csv文件后,我需要解析一个csv文件中的一列,该列的长度为22位数字。为了解析该列,我使用了LongType()。我使用map()函数定义列。
以下是我在pyspark中的命令。

>>> test=sc.textFile("test.csv")
>>> header=test.first()
>>> schemaString = header.replace('"','')
>>> testfields = [StructField(field_name, StringType(), True) for field_name in schemaString.split(',')]
>>> testfields[5].dataType = LongType()
>>> testschema = StructType(testfields)
>>> testHeader = test.filter(lambda l: "test_date" in l)
>>> testNoHeader = test.subtract(testHeader)
>>> test_temp = testNoHeader.map(lambda k: k.split(",")).map(lambda
p:(p[0],p[1],p[2],p[3],p[4],***float(p[5].strip('"'))***,p[6],p[7]))
>>> test_temp.top(2)


注意:我也尝试在变量test_temp中尝试使用“ long”和“ bigint”代替“ float”,但是spark中的错误是“未找到关键字”
    以下是输出

[('2012-03-14', '7', '1698.00', 'XYZ02abc008793060653', 'II93', ***8.27370028700801e+21*** , 'W0W0000000000007', '879870080088815007'), ('2002-03-14', '1', '999.00', 'ABC02E000050086941', 'II93', 8.37670028702205e+21, 'A0B0080000012523', '870870080000012421')]


我的csv文件中的值如下:
8.27370028700801e + 21是8273700287008010012345
8.37670028702205e + 21是8376700287022050054321

当我从中创建一个数据框架然后对其进行查询时,

>>> test_df = sqlContext.createDataFrame(test_temp, testschema)
>>> test_df.registerTempTable("test")
>>> sqlContext.sql("SELECT test_column FROM test").show()


test_column为所有记录赋予值“ null”。

因此,如何解决在Spark中解析大数字的问题,非常感谢您的帮助

最佳答案

好吧,类型很重要。由于将数据转换为float,因此不能在LongType中使用DataFrame。它之所以吹牛,不仅仅是因为PySpark在类型方面相对宽容。

同样,8273700287008010012345很大,可以表示为LontType,它只能表示-9223372036854775808和9223372036854775807之间的值。

如果要将数据保存到DataFrame,则必须使用DoubleType

from pyspark.sql.types import *

rdd = sc.parallelize([(8.27370028700801e+21, )])
schema = StructType([StructField("x", DoubleType(), False)])
rdd.toDF(schema).show()

## +-------------------+
## |                  x|
## +-------------------+
## |8.27370028700801E21|
## +-------------------+


通常,最好直接使用DataFrames处理此问题:

from pyspark.sql.functions import col

str_df = sc.parallelize([("8273700287008010012345", )]).toDF(["x"])
str_df.select(col("x").cast("double")).show()

## +-------------------+
## |                  x|
## +-------------------+
## |8.27370028700801E21|
## +-------------------+


如果不想使用Double,则可以指定精度转换为Decimal

str_df.select(col("x").cast(DecimalType(38))).show(1, False)

## +----------------------+
## |x                     |
## +----------------------+
## |8273700287008010012345|
## +----------------------+

关于python - 用于在pyspark中处理大数的数据类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36349585/

10-09 00:25