【问题标题】:Apache Spark: how to transform Data Frame column with regex to another Data Frame?Apache Spark:如何将带有正则表达式的数据框列转换为另一个数据框?
【发布时间】:2015-11-14 07:33:29
【问题描述】:

我有几列的 Spark 数据框 1:(user_uuid, url, date_visit)

我想将此 DF1 转换为 Data Frame 2,格式为:(user_uuid, domain, date_visit)

我想使用的是正则表达式来检测域并将其应用于 DF1 val regexpr = """(?i)^((https?):\/\/)?((www|www1)\.)?([\w-\.]+)""".r

您能帮我编写代码以在 Scala 中转换数据框吗?我对 Spark 和 Scala 完全陌生,语法很难。谢谢!

【问题讨论】:

  • " 我对 Spark 和 Scala 完全陌生" 目前这是一个非常“给我代码”的问题。你试过什么?你打算如何学习 Spark/Scala?最好通过自己尝试一些事情并在遇到困难时提出具体问题来使用 SO。正如您应该知道的那样,您在这里已经 4 年了!
  • @Paul,这确实是一个原子操作,但它无法通过互联网找到它。当您要求使用正则表达式时,您不会提出丑陋的尝试,对吧?我评估了我得到的代码,发现把它放在这里是没有意义的——它只是定义了一个 DF,它有什么帮助?是的,我在这里已经4年了,有很多其他的经验,给我讲课可能会觉得很愉快,但是在这个问题上我觉得不合适。
  • 我会更相信你通过 scaladoc 查看 DataFrame 的证据。那里的操作并不多,返回 DataFrame 的操作更少。如果您的问题是围绕“我如何为此使用select”,那么很明显您已经投入了一些工作,而不仅仅是把它扔到墙上。我不是(故意)讲课,但我正在尽力鼓励人们做必要的工作以避免浪费可能阅读问题的许多其他人的时间。也有两个评论赞成,所以看来我并没有完全孤立于此
  • @TheArchetypalPaul 随着时间的推移,我看到这个问题的答案帮助至少有 9 人支持它。它证明了在提问之前我应该​​“说服”谁相信我的笨拙尝试并不重要,因为无论如何问题对社区都有帮助。

标签: regex scala apache-spark


【解决方案1】:

火花 >= 1.5

你可以使用regexp_extract函数:

import org.apache.spark.sql.functions.regexp_extract

val patter: String = ??? 
val groupIdx: Int = ???

df.withColumn("domain", regexp_extract(url, pattern, groupIdx))

火花

定义一个 UDF

val pattern: scala.util.matching.Regex = ???

def getFirst(pattern: scala.util.matching.Regex) = udf(
  (url: String) => pattern.findFirstIn(url) match { 
    case Some(domain) => domain
    case None => "unknown"
  }
)

使用定义的UDF:

df.select(
  $"user_uuid",
  getFirst(pattern)($"url").alias("domain"),
  $"date_visit"
)

或注册临时表:

df.registerTempTable("df")

sqlContext.sql(s"""
  SELECT user_uuid, regexp_extract(url, '$pattern', $group_idx) AS domain, date_visit FROM df""")

pattern 替换为有效的Java 正则表达式,将group_id 替换为组的索引。

【讨论】:

  • 它有效,只是不要忘记在正则表达式之前和之后添加'之前'。
猜你喜欢
  • 2022-08-13
  • 2019-02-21
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多