2016-08-22 8 views
0

、私はスパークデータフレームがあるとし私が書きたい

data.show()

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の前と次の&の前に解析することになります。私はpysparkで同じことを書きたい、

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

次のようにPythonのデータフレームのためのpythonでこれを書くことができています。

私は、次のエラーを取得しています書き込み何かのように、

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()を入力し、操作を行います。しかし私のデータは巨大で、パンダに変換するとそれは遅くなります。私は私のようなことができスパークデータフレーム内の新しいカラムに直接これを書くことができる方法、

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のデータフレームで新しいテーブルとして追加するためにこれを行うことができますがありますか?これはデータフレームのすべての行に適用されますか?

+0

'withColumn'たり、あなたのデータフレームを変換するとともに、UDFを使用して調べてくださいrddにして 'map'を使ってください – David

+0

@David私はpysparkを初めて使っています。ちょうどこれらを知るようになる。あなたが気にしない場合は、マップ機能の使用を手伝ってもらえますか? – Observer

答えて

0

コメントで@デビッドで述べたように、あなたは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() 
関連する問題