2016-07-07 3 views
13

pySpark 1.6.1で行を動的に作成しようとしていて、データフレームに構築しようとしています。一般的な考え方は、describeの結果を、例えばスキューおよび尖度を含むように拡張することである。pySparkのdictから行を構築する

from pyspark.sql import Row 

row_dict = {'C0': -1.1990072635132698, 
      'C3': 0.12605772684660232, 
      'C4': 0.5760856026559944, 
      'C5': 0.1951877800894315, 
      'C6': 24.72378589441825, 
      'summary': 'kurtosis'} 

new_row = Row(row_dict) 

しかし、これはかなり明確な誤りであるTypeError: sequence item 0: expected string, dict foundを返します。ここでは、私が動作するはずと思ったものです。私は動的に内のフィールドを指定することができるように、それはいないようです除く細かいステップ、だろう

r = Row('summary', 'C0', 'C3', 'C4', 'C5', 'C6') 
r(row_dict) 
> Row(summary={'summary': 'kurtosis', 'C3': 0.12605772684660232, 'C0': -1.1990072635132698, 'C6': 24.72378589441825, 'C5': 0.1951877800894315, 'C4': 0.5760856026559944}) 

:それから私は私が最初の行のフィールドを定義した場合、私辞書を使用できることを見出しました。不明な名前の行が不明な場合には、これが必要です。ドキュメントによれば、あなたは実際には逆に行くことができます:

>>> Row(name="Alice", age=11).asDict() == {'name': 'Alice', 'age': 11} 
True 

私はこれを行うことができるはずです。また、これを許可した古いバージョンのいくつかの非難された機能があるかもしれません。たとえば、here。私が行方不明になっている現在の同等物はありますか?

答えて

17

あなたは次のように開梱キーワード引数を使用することができます。

Row(**row_dict) 

## Row(C0=-1.1990072635132698, C3=0.12605772684660232, C4=0.5760856026559944, 
##  C5=0.1951877800894315, C6=24.72378589441825, summary='kurtosis') 

internally sorts data by keyproblems with older Python versionsに対処することに注意することが重要です。

+0

これはPythonの特定のバージョンで有効ですか、それとも一般的なルールですか?私が求めているのはあなたの[最新の編集](https://stackoverflow.com/posts/38253641/revisions)です。 – eliasah

+1

@eliasah Sparkは常に内部的にソートするので、それ以前に行ったことは問題ではありません。そして、JIRAの議論では、SparkがPython <3.6をサポートしなくなるまでは変更されません。 OrderedDictは少し誤解を招いていたので、削除しました。 – zero323

+0

ありがとう!それが私の混乱の原因でした。 – eliasah

1

dictが平坦化されていない場合は、dictをRowに再帰的に変換できます。

def as_row(obj): 
    if isinstance(obj, dict): 
     dictionary = {k: as_row(v) for k, v in obj.items()} 
     return Row(**dictionary) 
    elif isinstance(obj, list): 
     return [as_row(v) for v in obj] 
    else: 
     return obj 
関連する問題