web-dev-qa-db-ja.com

リストのRDDからSpark= DataFrameを作成する

Rddの各レコードが次の形式であるrdd(myrddと呼ぶことができます)があります。

[('column 1',value), ('column 2',value), ('column 3',value), ... , ('column 100',value)]

これをpysparkでDataFrameに変換したい-これを行う最も簡単な方法は何ですか?

14
mgoldwasser

toDFメソッドを使用してはどうですか?フィールド名を追加するだけです。

df = rdd.toDF(['column', 'value'])
32
dapangmao

@dapangmaoによる答えは、この解決策に私を導きました:

my_df = my_rdd.map(lambda l: Row(**dict(l))).toDF()
11
mgoldwasser

DataFrame documentation を見て、この例を使用してください。ただし、これは機能するはずです。 RDDの名前はmy_rdd

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

# You have a ton of columns and each one should be an argument to Row
# Use a dictionary comprehension to make this easier
def record_to_row(record):
    schema = {'column{i:d}'.format(i = col_idx):record[col_idx] for col_idx in range(1,100+1)}
    return Row(**schema)


row_rdd = my_rdd.map(lambda x: record_to_row(x))

# Now infer the schema and you have a DataFrame
schema_my_rdd = sqlContext.inferSchema(row_rdd)

# Now you have a DataFrame you can register as a table
schema_my_rdd.registerTempTable("my_table")

SparkでDataFramesを使用したことはあまりありませんが、これでうまくいくはずです。

4
Kyle Heuton

Pysparkでは、serDFという名前のデータフレームがあるとします。

>>> type(userDF)
<class 'pyspark.sql.dataframe.DataFrame'>

RDDに変換するだけです(

userRDD = userDF.rdd
>>> type(userRDD)
<class 'pyspark.rdd.RDD'>

そして今、あなたはいくつかの操作を行い、例えばmap関数を呼び出すことができます:

newRDD = userRDD.map(lambda x:{"food":x['favorite_food'], "name":x['name']})

最後に、復元力のある分散データセットからDataFrameを作成します([〜#〜] rdd [〜#〜])。

newDF = sqlContext.createDataFrame(newRDD, ["food", "name"])

>>> type(ffDF)
<class 'pyspark.sql.dataframe.DataFrame'>

それで全部です。

私は電話しようとする前にこの警告メッセージを打っていました:

newDF = sc.parallelize(newRDD, ["food","name"] : 

.../spark-2.0.0-bin-hadoop2.7/python/pyspark/sql/session.py:336: UserWarning: Using RDD of dict to inferSchema is deprecated. Use pyspark.sql.Row inst  warnings.warn("Using RDD of dict to inferSchema is deprecated. "

これをもう行う必要はありません...

1
aks