Я пытаюсь сопоставить несколько столбцов из одного фрейма данных (df) с многоязычным словарем (df_label) и извлечь соответствующие метки для каждого столбца.
Примечание. Это не двойной вопрос Соединение нескольких столбцов из одной таблицы в один столбец из другой таблицы
Ниже приведен пример фреймов данных df и df_label и желаемого результата
df df_label output
+---+---+ +---+-----+----+ +---+---+------+------+------+
| s| o| | e| name|lang| | s| o|s_name|o_name| lang|
+---+---+ +---+-----+----+ +---+---+------+------+------+
| s1| o1| | s1|s1_en| en| | s2| o1| s2_fr| o1_fr| fr|
| s1| o3| | s1|s1_fr| fr| | s1| o1| s1_fr| o1_fr| fr|
| s2| o1| | s2|s2_fr| fr| | s1| o1| s1_en| o1_en| en|
| s2| o2| | o1|o1_fr| fr| | s2| o2| s2_fr| o2_fr| fr|
+---+---+ | o1|o1_en| en| +---+---+------+------+------+
| o2|o2_fr| fr|
+---+-----+----+
Другими словами, я хочу сопоставить оба столбца [s, o] из df со столбцом e из df_label и найти их соответствующие метки на разных языках, как показано выше.
Многоязычный словарь (df_label) огромен, а столбцы [s, o] имеют много дубликатов, поэтому две операции соединения крайне неэффективны.
Есть ли какой-нибудь способ, который может быть достигнут без нескольких объединений?
К вашему сведению, это то, что я делал, используя несколько объединений, но мне действительно это не нравится.
df = spark.createDataFrame([('s1','o1'),('s1','o3'),('s2','o1'),('s2','o2')]).toDF('s','o')
df_label = spark.createDataFrame([('s1','s1_en','en'),('s1','s1_fr','fr'),('s2','s2_fr','fr'),('o1','o1_fr','fr'),('o1','o1_en','en'),('o2','o2_fr','fr')]).toDF('e','name','lang')
df = df.join(df_label,col('s')==col('e')).drop('e').withColumnRenamed('name','s_name').withColumnRenamed('lang','s_lang')
df = df.join(df_label,col('o')==col('e')).drop('e').withColumnRenamed('name','o_name').select('s','o','s_name','o_name','s_lang','o','o_name','lang').withColumnRenamed('lang','o_lang').filter(col('o_lang')==col('s_lang')).drop('s_lang')