2016-04-01 29 views
2

Ben python ile kıvılcım kullanıyorum.Bir csv dosyası yükledikten sonra, 22 basamak uzunluğunda olan bir csv dosyasında bir sütunu ayrıştırmak gerekiyordu. Bu sütunu ayrıştırmak için LongType() kullandım. Sütunu tanımlamak için map() işlevini kullandım. Pyspark'taki komutlarım aşağıdadır.veri türü

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

Not: Ben de değişken test_temp yılında 'şamandıra' yerine 'uzun' ve 'bigint' denedi, ama kıvılcım hata oldu 'anahtar bulunamadı' Ve şudur çıkış

[('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')] 

aşağıdaki benim csv dosyasında değer olarak: 8.27370028700801e + 21 olduğunu Bunun dışında bir veri çerçevesi oluşturmak ve daha sonra sorgulandığında8.37670028702205e + 21

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

test_column

tüm kayıtlar için 'boş' değerini verir,

olup.

Yani, kıvılcım büyük numarası ayrıştırma bu sorunun çözümü için nasıl gerçekten

cevap

3

Eh, türleri önemli yardımın için teşekkür ederiz. Verilerinizi float'a dönüştürdüğünüzden, DataFrame'da LongType kullanamazsınız. Yalnızca PySpark'ın türlere geldiğinde göreceli olarak affedilmesi nedeniyle patlamaz.

:

Ayrıca 8273700287008010 İsterseniz DoubleType kullanmak gerekecektir bir DataFrame için verilerinize -9223372036854775808 ve

9223372036854775807. arasındaki tek değerleri temsil hangi LontType olarak temsil edilmesi büyük olmaktır

from pyspark.sql.functions import col 

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

## +-------------------+ 
## |     x| 
## +-------------------+ 
## |8.27370028700801E21| 
## +-------------------+ 
:
from pyspark.sql.types import * 

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

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

Tipik doğrudan DataFrames ile bu işlemek için daha iyi bir fikir

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

## +----------------------+ 
## |x      | 
## +----------------------+ 
## |8273700287008010| 
## +----------------------+ 
: Eğer Double kullanmak istemiyorsanız

belirtilen hassasiyetle Decimal yayın yapabilirsiniz