[英]Apply fuzzy matching across a dataframe column and save results in a new column
[英]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數據幀中的新表? 哪個適用於數據框的每一行?
正如在評論中提及的@大衛,你可以使用udf
和withColumn
:
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.