簡體   English   中英

將正則表達式應用於spark數據框的每一行,並將其另存為同一數據框中的新列

[英]Apply regex to every row of a spark dataframe and save it as a new column in the same dataframe

假設我有一個Spark數據框,

數據顯示()

ID                URL
1             https://www.sitename.com/&q=To+Be+Parsed+out&oq=Dont+Need+to+be+parsed
2             https://www.sitename.com/&q=To+Be+Parsed+out&oq=Dont+Need+to+be+parsed
3             https://www.sitename.com/&q=To+Be+Parsed+out&oq=Dont+Need+to+be+parsed
4             https://www.sitename.com/&q=To+Be+Parsed+out&oq=Dont+Need+to+be+parsed
5                 None

我想向它寫一個正則表達式操作,在這里我想解析特定場景的URL。 場景是在&q之后和next&之前解析。 我可以在python中為python數據幀編寫如下代碼,

re.sub(r"\s+", " ", re.search(r'/?q=([^&]*)', data['url'][i]).group(1).replace('+', ' ')

我想在pyspark中寫同樣的東西。

如果寫這樣的話,

 re.sub(r"\s+", " ", re.search(r'/?q=([^&]*)', data.select(data.url.alias("url")).collect()).group(1).replace('+', ' '))

要么

re.sub(r"\s+", " ", re.search(r'/?q=([^&]*)', data.select(data['url']).collect()).group(1).replace('+', ' '))

我收到以下錯誤,

TypeError: expected string or buffer

一種選擇是使用以下命令將數據轉換為熊貓:

data.toPandas() ,然后執行操作。 但是我的數據很大,將其轉換為熊貓會使其變慢。 有什么辦法可以將其直接寫到spark數據框中的新列中,

ID                URL                                                                           word
1             https://www.sitename.com/&q=To+Be+Parsed+out&oq=Dont+Need+to+be+parsed       To Be Parsed out   
2             https://www.sitename.com/&q=To+Be+Parsed+out&oq=Dont+Need+to+be+parsed       To Be Parsed out 
3             https://www.sitename.com/&q=To+Be+Parsed+out&oq=Dont+Need+to+be+parsed       To Be Parsed out 
4             https://www.sitename.com/&q=To+Be+Parsed+out&oq=Dont+Need+to+be+parsed       To Be Parsed out 
5             None                                                                             None

我們如何才能將其添加為pyspark數據幀中的新表? 哪個適用於數據框的每一行?

正如在評論中提及的@大衛,你可以使用udfwithColumn

Scala代碼:

import org.apache.spark.sql.functions._

val getWord: (String => String) = (url: String) => {
  if (url != null) {
    """/?q=([^&]*)""".r
      .findFirstIn(url)
      .get
      .replaceAll("q=", "")
      .replaceAll("\\+", " ")
  }
  else
    null
}
val udfGetWord = udf(getWord)
df.withColumn("word", udfGetWord($"url")).show()

Pyspark代碼:

#Create dataframe with sample data

df = spark.createDataFrame([(1,'https://www.sitename.com/&q=To+Be+Parsed+out&oq=Dont+Need+to+be+parsed'),(2,'https://www.sitename.com/&q=To+Be+Parsed+out&oq=Dont+Need+to+be+parsed'),(3,'https://www.sitename.com/&q=To+Be+Parsed+out&oq=Dont+Need+to+be+parsed'),(4,'https://www.sitename.com/&q=To+Be+Parsed+out&oq=Dont+Need+to+be+parsed'),(5,'None')],['id','url'])

使用substr使用位置索引剪切所需的字符串,並使用instr識別搜索模式的位置。

regexp_replace用於將'+'符號替換為空格。

df.selectExpr("id",
              "url",
              "regexp_replace(substr(url,instr(url,'&q')+3, instr(url,'&oq') - instr(url,'&q') - 3 ),'\\\+',' ') AS word")\
.show()

#+---+--------------------+----------------+
#| id|                 url|            word|
#+---+--------------------+----------------+
#|  1|https://www.siten...|To Be Parsed out|
#|  2|https://www.siten...|To Be Parsed out|
#|  3|https://www.siten...|To Be Parsed out|
#|  4|https://www.siten...|To Be Parsed out|
#|  5|                None|                |
#+---+--------------------+----------------+

如果搜索字符串中不存在搜索模式,則將返回空白。 這可以是使用case語句的句柄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM