2016-11-26 1 views
4

現在、Spark 1.4.1を使用しています。入れ子になっている辞書を含む辞書をSpark DataFrameに変換することはできません。入れ子になったdictをに変換しますが、スキーマは受け入れられないようです。ここでPySparkはdictsのRDDをDataFrameに変換できません。エラー:タイプ<class 'pyspark.sql.types.Row'>のオブジェクトを受け入れることができません。

は私のエラーを再現するためのコードです:私はこのエラーが発生した理由を

from pyspark.sql import Row, SQLContext, types as pst 
sqlContext = SQLContext(sc) 

example_dict = Row(**{"name": "Mike", "data": Row(**{"age": 10, "like": True})}) 

example_rdd = sc.parallelize([example_dict]) 

nested_fields = [pst.StructField("age", pst.IntegerType(), True), 
       pst.StructField("like", pst.BooleanType(), True)] 

schema = pst.StructType([ 
       pst.StructField("data", pst.StructType(nested_fields), True), 
       pst.StructField("name", pst.StringType(), True) 
]) 

df = sqlContext.createDataFrame(example_rdd, schema) 

TypeError: StructType(List(StructField(age,IntegerType,true),StructField(like,BooleanType,true))) can not accept object in type <class 'pyspark.sql.types.Row'> 

は私はわかりません。私は何かが欠けていた場合

>>> example_rdd.first() 
Row(data=Row(age=10, like=True), name='Mike') 

>>> schema 
StructType(List(StructField(data,StructType(List(StructField(age,IntegerType,true),StructField(like,BooleanType,true))),true),StructField(name,StringType,true))) 

私はわからないが、スキーマオブジェクトと一致していることを表示されます。ここではobjects rddschemaです。 Spark 1.4.1が行内で行を受け入れない理由はありますか?

注:これはSpark 2.0.2の問題ではありませんが、残念ながら私はSpark 1.4.1を使用して共有リソースを使用していますので、しばらくの間回避策を見つける必要があります。 !。

pst._acceptable_types[pst.StructType] 
(tuple, list) 

とスパークは、素朴なチェックを行います:進める

答えて

3

をがスパーク1.4にStructTypeは受け付けていませんので、この問題が発生したと認められな種類があり

type(obj) not in _acceptable_types[_type] 

オブジェクトでは明らかに機能しません。現在のバージョンでは何が起こるかに相当し、正しい条件は、次のようになります。

Row(**{"name": "Mike", "data": (10, True)}) 

または

((10, True), "Mike") 

isinstance(obj, _acceptable_types[_type]) 

あなたは、ネストされた列を使用したい場合は、プレーンなPythonのtupleを使用することができます

関連する問題