次の問題があります:列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()
ですか?または、まったく別のソリューションが必要ですか?ありがとう!