2017-03-10 23 views
0

私は非常に新しいApache Sparkです。私はcsvファイルをSpark RDDとDataFramesにロードしようとしています。RDDでスキーマを強制してDataFrameに変換する

私はRDDを使用してデータを操作し、Dataframe for SQLのようなデータフレームの操作を使用します。

RDDをSpark DataFrameに変換する際に問題が発生します。問題のステートメントを以下に示します。

データは
print (dataRDD.take(3)) 
[['Name', 'f1', 'f2', 'f3', 'f4'], ['Joe', '5', '7', '8', '3'], ['Jill', '3', '2', '2', '23']] 

print (dataDF.take(3)) 
[Row(_c0='Name', _c1='f1', _c2='f2', _c3='f3', _c4='f4'), Row(_c0='Joe', _c1='5', _c2='7', _c3='8', _c4='3'), Row(_c0='Jill', _c1='3', _c2='2', _c3='2', _c4='23')] 

print schema 
StructType(List(StructField(Name,StringType,true),StructField(f1,IntegerType,true),StructField(f2,IntegerType,true),StructField(f3,IntegerType,true),StructField(f4,IntegerType,true))) 

データ操作

def splitWords(line): 
    return ['Jillwa' if item=='Jill' else item for item in line] 

dataCleanRDD = dataRDD.map(splitWords) 

問題のように見える
# to load data 
dataRDD = sc.textFile(trackfilepath) 
# To use it as a csv  
dataRDD = testData.mapPartitions(lambda x: csv.reader(x)) 
# To load into data frame and capture the schema 
dataDF = sqlContext.read.load(trackfilepath, 
         format='com.databricks.spark.csv', 
         header='true', 
         inferSchema='true') 
schema = dataDF.schema 

:今、私は以下のコードを使用してデータフレームに操作RDDを保存しようとしています

およびスキーマです。

dataCleanDF = sqlContext.createDataFrame(dataCleanRDD, schema=schema) 

これは私に、以下のエラーを与える:

TypeError: IntegerType can not accept object 'f1' in type <class 'str'> 

エラーがRDDとスキーマの値のデータ型の不一致が原因です。 RDDはすべてのものを文字列として扱い、スキーマはフィールド1のフィールド2の整数を持ちます。これはダミーのデータセットです。実際のデータセットは200列と100000行で構成されています。したがって、手動でRDD値を整数に変更することは困難です。

RDD値にスキーマを強制する方法があるのだろうかと思っていました。どんな助けもありがとう。だから、あなたはあなたのスキーマとデータを持つことになりますし、あなたが列でそれらの上に、代わりに、マップを使用して動作することができます

df = sqlContext.read.format("com.databricks.spark.csv") 
    .schema(dataSchema) 
      .option("header", "false") 
      .option("delimiter", ",") 
      .option("inferSchema", "true") 
      .option("treatEmptyValuesAsNulls", "true") 
      .option("nullValue", "null") 
      .load("data.csv") 

:スキーマでcsvファイルを読みたい場合は

答えて

1

することは、私のような何かをすることをお勧めそれの中のudfので、あなたは常にあなたと列名を持っています。

また、より大きなデータセットを持っている場合は、最初に寄木細工やORCフォーマットで保存してから再度読み取って操作してください。エラーが多く発生し、パフォーマンスが非常に高くなります。

+0

ありがとうございます。「udf」の提案は本当に助けになりました – Sam

関連する問題