2017-01-12 3 views
-1

私は20TBのデータを持っています。私は(Solution used found here)以下のように行列を刺激するために、スパークデータフレームを変換しようとした: 私のデータフレームは、次のようになります。スパーク - パンダを使わずにデータフレームまたはrddをスパーク行列またはnumpy配列に変換する方法

+-------+---------------+--------------------+ 
|goodsID|customer_group|customer_phone_number| 
+-------+---------------+--------------------+ 
| 123|   XXXXX|   XXXXXXXX| 
| 432|   YYYYY|   XXXXXXXX| 
+-------+---------------+--------------------+ 

from pyspark.mllib.linalg.distributed import IndexedRow, IndexedRowMatrix 

mat = IndexedRowMatrix(mydataframe.map(lambda row: IndexedRow(*row))) 
mat.numRows() 
mat.numCols() 

が、それは誤り以下の私を与える:

Caused by: org.apache.spark.api.python.PythonException: Traceback (most recent call last): 
    File "/home/test/spark-1.6.0-bin-hadoop2.6/python/lib/pyspark.zip/pyspark/worker.py", line 111, in main 
    process() 
    File "/home/test/spark-1.6.0-bin-hadoop2.6/python/lib/pyspark.zip/pyspark/worker.py", line 106, in process 
    serializer.dump_stream(func(split_index, iterator), outfile) 
    File "/home/test/spark-1.6.0-bin-hadoop2.6/python/lib/pyspark.zip/pyspark/serializers.py", line 263, in dump_stream 
    vs = list(itertools.islice(iterator, batch)) 
    File "/home/test/spark-1.6.0-bin-hadoop2.6/python/pyspark/rdd.py", line 1293, in takeUpToNumLeft 
    yield next(iterator) 
    File "<stdin>", line 1, in <lambda> 
TypeError: __init__() takes exactly 3 arguments (4 given) 

だから私の質問は

です
  1. スパークでこれをどのように達成できますか?
  2. また、データフレームをnumpy配列に変換するにはどうすればよいですか?
  3. スパークのパンダを使用しているのは本当に悪いですか?

答えて

0
  • 入力データの種類は、おそらく間違っています。ベクトル値はDouble(Python float)でなければなりません。

  • 正しい方法でIndexedRowを使用しないでください。 indexとvectorの2つの引数をとります。我々はデータが正しい型であると仮定した場合

    mat = IndexedRowMatrix(mydataframe.map(
    lambda row: IndexedRow(row[0], Vectors.dense(row[1:])))) 
    
  • はパンダ悪いのですか? 20TBのデータは?最高の選択ではなく、there exist distributed Python libraries with similar API。私はまだあなたが与えた解決策に取り組んでいます

+0

、また影響があるため、これらのネストされたループであるだろうどのくらいのパフォーマンス行列計算の多くが起こっているその内側のループ(5レベル)、のためのネストされたのがたくさんありますまた、20日掛かるデータセット全体を処理するためのパフォーマンスを向上させるために、foreach、map、またはflatmapを使用してコードを書き直す必要があります。 –

関連する問題