2017-09-18 6 views
0

私は比較的新しいPysparkです。私を盗聴され Pysparkを修正できません:フィールドの長さの誤り(%d) "%(len(obj)、len(dataType.fields))

lines = sc.textFile('train.csv') 
from pyspark.sql.types import * 

train.csvがhereに格納されている:それは少し大きい

最初の行は列情報を含むデータの最初の行からのスキーマを設定するため

fields = [StructField(field_name, StringType(), True) for field_name in lines.first().split(',')] # I am setting the schema here 
schema = StructType(fields) 
mstr_header = lines.filter(lambda l: "Country" in l) #Ihave seen the first row of the data, I want to remove it. Only the first row contains 'Country' 
linesNoHeader = lines.subtract(mstr_header) 

lines_df = linesNoHeader.map(lambda x: x.split(",")).toDF(schema) #make a dataframe 
私は lines_df.count()を実行すると

、PySparkは私が間違っているつもり場所を把握することができません、

length of fields (%d)" % (len(obj), len(dataType.fields)))ValueError: Length of object (18) does not match with length of fields (17)

をというエラーがスローされます。大きなデータファイルに対する謝罪。

答えて

2

この問題は、ファイル内で最初の数行に17個のフィールドが含まれていますが、さらに多くのフィールドが含まれています(実際にはフィールドは増えませんが、あなたはちょうどsplitを使用します)。

あなただけの非常に簡単にシェルコマンドを使用して、これをチェックすることができます。

cat train.csv | awk -F ',' '{print NF-1, NR}' | grep -v "^16" 

(1行に1 ,の数をカウントし、正確に16、すなわち17個のフィールドを持っていないものを破棄しています)。いくつかの,が含まれているURLのクエリ、時

16805,PH,-1.0,A,2017-08-21 00:03:13,Generic,android_webkit,Android," http://supertraff.com/l/32398308f0e2f715d41?vId=bmconv_20170820203313_6b3e1d81_172f_4fd6_8725_f8cc7522896d&sub=20386192139,8753761,5,3177&source=Unknown&test=a ",112.198.101.161,False,,0.0,282,,4901.0,0.0

ルック:

最初の例では、このような行16807、です。幸いにも、csvが標準で、,から逃れるためにフィールドの始めと終わりに二重引用符が付いています。データを使用してcsvリーダー。

たとえば、this answerまたはdocumentationを参照してください。

関連する問題