多くのIDを効率的に検索したい。Apache Sparkでの効率的なデータフレーム参照
+-------+----------------+
| URI| Links_lists|
+-------+----------------+
| URI_1|[URI_8,URI_9,...|
| URI_2|[URI_6,URI_7,...|
| URI_3|[URI_4,URI_1,...|
| URI_4|[URI_1,URI_5,...|
| URI_5|[URI_3,URI_2,...|
+-------+----------------+
私の最初のステップは、df_source
の外にRDD
を作るために、次のようになります:
rdd_source = df_source.rdd
私は何を持っていることは、この
dataframe
df_source
のように見えますが、10人の労働者に配布夫婦百万のレコードを持つこと
dataframe
です
out of rdd_source
私はRDD
を作成して、IDを持つURIだけを含んでいます。私はそのようにこれを行う:
rdd_index = rdd_source.map(lambda x: x[0]).zipWithUniqueId()
今私も.flatMap()
すべての関係が含まれていRDD
まででrdd_source
。これまではLinks_list
列にのみ含まれていました。
rdd_relations = rdd_source.flatMap(lamda x: x)
私が参加し、私は(私はこれで間違っているかもしれない)と思いますしたいので、今私は戻ってdataframes
にrdd_index
とrdd_relations
の両方を変換するには、dataframes
に参加する高速です。
schema_index = StructType([
StructField("URI", StringType(), True),
StructField("ID", IntegerType(), True))
df_index = sqlContext.createDataFrame(rdd_index, schema=schema_index)
と
schema_relation = StructType([
StructField("URI", StringType(), True),
StructField("LINK", StringType(), True))
df_relations = sqlContext.createDataFrame(rdd_relations, schema=schema_relation)
結果dataframes
は、これら二つのようになります。私がどうなるdf_relations
に長い文字列のURIを置き換えるために、今
df_index:
+-------+-------+
| URI| ID|
+-------+-------+
| URI_1| 1|
| URI_2| 2|
| URI_3| 3|
| URI_4| 4|
| URI_5| 5|
+-------+-------+
df_relations:
+-------+-------+
| URI| LINK|
+-------+-------+
| URI_1| URI_5|
| URI_1| URI_8|
| URI_1| URI_9|
| URI_2| URI_3|
| URI_2| URI_4|
+-------+-------+
df_index
に参加し、最初の参加:
df_relations =\
df_relations.join(df_index, df_relations.URI == df_index.URI,'inner')\
.select(col(ID).alias(URI_ID),col('LINK'))
これは私にこのように見てdataframe
得なければならない:
df_relations:
+-------+-------+
| URI_ID| LINK|
+-------+-------+
| 1| URI_5|
| 1| URI_8|
| 1| URI_9|
| 2| URI_3|
| 2| URI_4|
+-------+-------+
そして、第二の参加:
df_relations =\
df_relations.join(df_index, df_relations.LINK == df_index.URI,'inner')\
.select(col(URI_ID),col('ID').alias(LINK_ID))
これが最後のdataframe
私が必要とする1になるはずですが。このように見える
df_relations:
+-------+-------+
| URI_ID|LINK_ID|
+-------+-------+
| 1| 5|
| 1| 8|
| 1| 9|
| 2| 3|
| 2| 4|
+-------+-------+
ここで、すべてのURIはdf_index
のIDで置き換えられます。
これは、リレーションテーブルの両方の列にあるすべてのURIのIDを調べる効率的な方法ですか、これを行うより効果的な方法はありますか?
私はあなたが説明した動作のためにRDDを使用する必要はありませんPythonの3.5
私は明日お試しいただきありがとうございます! – Thagor