1

次の問題があります:列Aの各IDごとに列Bの値のすべての組み合わせを見つけ、結果をDataFrameとして返す必要があります

以下の入力 DataFrame の例

        A     B       
0       5    10       
1       1    20      
2       1    15       
3       3    50       
4       5    14       
5       1    30       
6       1    15       
7       3    33       

次の出力 DataFrame を取得する必要があります (GraphX\GraphFrame 用です)。

        src dist      A
0       10   14       5
1       50   33       3
2       20   15       1
3       30   15       1
4       20   30       1

私が今まで考えていた1つの解決策は次のとおりです。

df_result = df.drop_duplicates().\
               map(lambda (A,B):(A,[B])).\
               reduceByKey(lambda p, q: p + q).\
               map(lambda (A,B_values_array):(A,[k for k in itertools.combinations(B_values_array,2)]))

print df_result.take(3)

出力: [(1, [(20,15),(30,20),(30,15)]),(5,[(10,14)]),(3,[(50,33)]) ]

そして、ここで私は立ち往生しています:(必要なデータフレームに戻す方法は? 1つのアイデアは、並列化を使用することでした:

import spark_sc

edges = df_result.map(lambda (A,B_pairs): spark_sc.sc.parallelize([(k[0],k[1],A) for k in B_pairs]))

spark_sc.pyspark_scという名前の他のファイルがあるため

def init():
    global sc
    global sqlContext

    sc = SparkContext(conf=conf,
                  appName="blablabla",
                  pyFiles=['my_file_with_code.py'])

    sqlContext = SQLContext(sc)

しかし、私のコードは失敗しました:

AttributeError: 'module' object has no attribute 'sc'

spark_sc.sc()notを使用するmap()と、動作します。

最後のステップで何が欠けているのか分かりますか? 使用することはまったく可能parallelize()ですか?または、まったく別のソリューションが必要ですか?ありがとう!

4

1 に答える 1

1

次のような簡単な別のソリューションが必要です。

from pyspark.sql.functions import greatest, least, col

df.alias("x").join(df.alias("y"), ["A"]).select(
    least("x.B", "y.B").alias("src"), greatest("x.B", "y.B").alias("dst"), "A"
).where(col("src") != col("dst")).distinct()

どこ:

df.alias("x").join(df.alias("y"), ["A"])

A、によってテーブルをそれ自体と結合します

least("x.B", "y.B").alias("src")

greatest("x.B", "y.B")

ソースとして低い値を選択idし、宛先として高い ID を選択します。ついに:

where(col("src") != col("dst"))

自己ループをドロップします。

一般にSparkContext、アクションまたは変換から使用することはできません (あなたの場合、これを行う意味がないというわけではありません)。

于 2016-10-19T10:27:16.030 に答える