【发布时间】:2022-01-16 14:05:20
【问题描述】:
我正在尝试从 URL 中提取域。
输入:
import org.apache.spark.sql._
import org.apache.spark.sql.functions._
val b = Seq(
("subdomain.example.com/test.php"),
("example.com"),
("example.buzz"),
("test.example.buzz"),
("subdomain.example.co.uk"),
).toDF("raw_url")
var c = b.withColumn("host", callUDF("parse_url", $"raw_url", lit("HOST"))).show()
预期结果:
+--------------------------------+---------------+
| raw_url | host |
+--------------------------------+---------------+
| subdomain.example.com/test.php | example.com |
| example.com | example.com |
| example.buzz | example.buzz |
| test.example.buzz | example.buzz |
| subdomain.example.co.uk | example.co.uk |
+------------------------------- +---------------+
非常感谢任何建议。
编辑:根据@AlexOtt 的提示,我离我更近了几步。
import com.google.common.net.InternetDomainName
import org.apache.spark.sql._
import org.apache.spark.sql.functions._
val b = Seq(
("subdomain.example.com/test.php"),
("example.com"),
("example.buzz"),
("test.example.buzz"),
("subdomain.example.co.uk"),
).toDF("raw_url")
var c = b.withColumn("host", callUDF("InternetDomainName.from", $"raw_url", topPrivateDomain)).show()
但是,我显然没有用 withColumn 正确实现它。这是错误:
错误:未找到:值 topPrivateDomain var c = b.withColumn("host", callUDF("InternetDomainName.from", $"raw_url", topPrivateDomain)).show()
编辑 2:
从@sarveshseri 那里得到了一些好的指示,在清理了一些语法错误之后,以下代码能够从大多数 URL 中删除子域。
import org.apache.spark.sql.functions.udf
import org.apache.spark.sql._
import org.apache.spark.sql.functions._
import com.google.common.net.InternetDomainName
import java.net.URL
val b = Seq(
("subdomain.example.com/test.php"),
("example.com"),
//("example.buzz"),
//("test.example.buzz"),
("subdomain.example.co.uk"),
).toDF("raw_url")
val hostExtractUdf = org.apache.spark.sql.functions.udf {
(urlString: String) =>
val url = new URL("https://" + urlString)
val host = url.getHost
InternetDomainName.from(host).topPrivateDomain().name()
}
var c = b.select("raw_url").withColumn("HOST",
hostExtractUdf(col("raw_url")))
.show(false)
但是,它仍然无法按预期工作。 .buzz 和 .site 和 .today 等较新的后缀会导致以下错误:
Caused by: java.lang.IllegalStateException: Not under a public suffix: example.buzz
【问题讨论】:
-
你需要包装一些支持通过公共后缀列表查找的库:publicsuffix.org - 规则相当复杂
-
感谢@AlexOtt 的提示,这在一定程度上有所帮助。我找到了这个stackoverflow.com/questions/45046265/…。但是,我仍然坚持如何将 InternetDomainName.from().topPrivateDomain 应用于 withColumn
标签: scala apache-spark guava url-parsing