web-dev-qa-db-ja.com

pysparkを使用してタプルのリストからDataFrameを作成します

Simple-salesforceパッケージを使用してSFDCから抽出したデータを使用しています。スクリプト作成にPython3を使用しており、Spark 1.5.2。

次のデータを含むrddを作成しました。

[('Id', 'a0w1a0000003xB1A'), ('PackSize', 1.0), ('Name', 'A')]
[('Id', 'a0w1a0000003xAAI'), ('PackSize', 1.0), ('Name', 'B')]
[('Id', 'a0w1a00000xB3AAI'), ('PackSize', 30.0), ('Name', 'C')]
...

このデータはv_rddと呼ばれるRDDにあります

私のスキーマは次のようになります。

StructType(List(StructField(Id,StringType,true),StructField(PackSize,StringType,true),StructField(Name,StringType,true)))

このRDDからDataFrameを作成しようとしています。

sqlDataFrame = sqlContext.createDataFrame(v_rdd, schema)

DataFrameを印刷します。

sqlDataFrame.printSchema()

そして、次を取得します。

+--------------------+--------------------+--------------------+
|                  Id|  PackSize|                          Name|
+--------------------+--------------------+--------------------+
|[Ljava.lang.Objec...|[Ljava.lang.Objec...|[Ljava.lang.Objec...|
|[Ljava.lang.Objec...|[Ljava.lang.Objec...|[Ljava.lang.Objec...|
|[Ljava.lang.Objec...|[Ljava.lang.Objec...|[Ljava.lang.Objec...|

次のような実際のデータが表示されることを期待しています。

+------------------+------------------+--------------------+
|                Id|PackSize|                          Name|
+------------------+------------------+--------------------+
|a0w1a0000003xB1A  |               1.0|       A            |
|a0w1a0000003xAAI  |               1.0|       B            |
|a0w1a00000xB3AAI  |              30.0|       C            |

ここで私が間違っていることを特定するのを手伝ってください。

私のPythonスクリプトは長いですが、人々がそれをふるいにかけるのが便利かどうか確信が持てないので、問題のある部分だけを投稿しました。

事前にトンありがとう!

12
Pit

次回は実用的な例を提供できますか。それは簡単だろう。

RDDの表示方法は、DataFrameを作成するのは基本的に奇妙です。これは、DFドキュメントに従ってSparkを作成する方法です。

>>> l = [('Alice', 1)]
>>> sqlContext.createDataFrame(l).collect()
[Row(_1=u'Alice', _2=1)]
>>> sqlContext.createDataFrame(l, ['name', 'age']).collect()
[Row(name=u'Alice', age=1)]

あなたの例に関しては、次のように希望する出力を作成できます:

# Your data at the moment
data = sc.parallelize([ 
[('Id', 'a0w1a0000003xB1A'), ('PackSize', 1.0), ('Name', 'A')],
[('Id', 'a0w1a0000003xAAI'), ('PackSize', 1.0), ('Name', 'B')],
[('Id', 'a0w1a00000xB3AAI'), ('PackSize', 30.0), ('Name', 'C')]
    ])
# Convert to Tuple
data_converted = data.map(lambda x: (x[0][1], x[1][1], x[2][1]))

# Define schema
schema = StructType([
    StructField("Id", StringType(), True),
    StructField("Packsize", StringType(), True),
    StructField("Name", StringType(), True)
])

# Create dataframe
DF = sqlContext.createDataFrame(data_converted, schema)

# Output
DF.show()
+----------------+--------+----+
|              Id|Packsize|Name|
+----------------+--------+----+
|a0w1a0000003xB1A|     1.0|   A|
|a0w1a0000003xAAI|     1.0|   B|
|a0w1a00000xB3AAI|    30.0|   C|
+----------------+--------+----+

お役に立てれば

22
Dat Tran