Я пытаюсь написать код pyspark для следующего SQL-запроса:
Create table table1 as
Select a.ip_address,a.ip_number,b.ip_start_int,b.ip_end_int,b.post_code_id,b.city,b.region_name,b.two_letter_country
from nk_ip_address_check a
join
ip_additional_pulse b
on a.ip_number between b.ip_start_int and b.ip_end_int
Приведенный выше запрос объединяет две таблицы и использует предложение «между» с предложением «on». Я написал UDF, который делает то же самое, но кажется, что он очень медленный. Есть ли способ написать вышеуказанный запрос в коде pyspark, который даст мне лучшую производительность.
Ниже приведен код, который я использую
def ip_mapping(ip_int):
ip_qry = "select country_code,region_code,city_code,postal_code from de_pulse_ip_pqt where ip_start_int < {} and ip_end_int > {}".format(ip_int,ip_int)
result = spark.sql(ip_qry)
country_code = result.rdd.map(lambda x: x['country_code']).first()
return country_code
ip_mapped = udf(ip_mapping, IntegerType())
df_final = df.withColumn("country_code", ip_mapped("ip_int"))
это очень неэффективно. более того, если у меня есть region_code , я должен вызвать, изменив возвращаемое значение функции ip_mapping.
df_final = df.withColumn("region_code", ip_mapped("ip_int"))