Join 使用between子句连接两个pyspark数据帧,以从一系列ip中查找ip详细信息
我正在尝试为以下sql查询编写pyspark代码:Join 使用between子句连接两个pyspark数据帧,以从一系列ip中查找ip详细信息,join,apache-spark,pyspark,spark-dataframe,pyspark-sql,Join,Apache Spark,Pyspark,Spark Dataframe,Pyspark Sql,我正在尝试为以下sql查询编写pyspark代码: 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_
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”子句的“between”子句。我已经写了一个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"))
那么,对于DF中的每个IP,您在另一个DF中执行IP->GeoIP enrichment的搜索
易解->考虑使用Max DISB-< /P> 无论如何,您应该对每个IP执行一次操作,并返回特定IP的所有GeoIP数据
ip_映射函数应返回项目列表(例如:(国家代码、城市代码、地区代码))您的UDF应该使用数组的模式,UDF的结果将是几列输出(有关更多信息,请参见)您可以使用
在之间定义联接条件,并在联接中使用它。下面的例子应该适合你
join_condition = [nk_ip_address_check.ip_number.between(ip_additional_pulse.ip_start_int,ip_additional_pulse.ip_end_int)]
nk_ip_address_check.alias('a')\
.join(ip_additional_pulse.alias('b'),cond)\
.selectExpr("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")
请分享你写的代码如果你能分享一些示范性的数据也会更容易谢谢你的回答。我不能使用第一个,因为我们已经有一个经过验证的付费数据源。我已经修改了我的UDF,但在性能上没有多大改进。
join_condition = [nk_ip_address_check.ip_number.between(ip_additional_pulse.ip_start_int,ip_additional_pulse.ip_end_int)]
nk_ip_address_check.alias('a')\
.join(ip_additional_pulse.alias('b'),cond)\
.selectExpr("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")