Win*_*ing 0 scala apache-spark apache-spark-sql
Spark新手在这里,希望你们能给我一些帮助.谢谢!
我正在尝试从CSV文件中提取URL,并且URL位于第16列.问题是URL是以一种奇怪的格式编写的,正如您从下面的代码中打印出来的那样.获取正确格式的URL的最佳方法是什么?
case class log(time_stamp: String, url: String )
val logText = sc.textFile("hdfs://...").map(s => s.split(",")).map( s => log(s(0).replaceAll("\"", ""),s(15).replaceAll("\"", ""))).toDF()
logText.registerTempTable("log")
val results = sqlContext.sql("SELECT * FROM log")
results.map(s => "URL: " + s(1)).collect().foreach(println)
URL: /XXX/YYY/ZZZ/http/www.domain.com/xyz/xyz
URL: /XX/YYY/ZZZ/https/sub.domain.com/xyz/xyz/xyz/xyz
URL: /XXX/YYY/ZZZ/http/www.domain.com/
URL: /VV/XXXX/YYY/ZZZ/https/sub.domain.com/xyz/xyz/xyz
Run Code Online (Sandbox Code Playgroud)
你可以尝试regexp_replace:
import org.apache.spark.sql.functions.regexp_replace
val df = sc.parallelize(Seq(
(1L, "/XXX/YYY/ZZZ/http/www.domain.com/xyz/xyz"),
(2L, "/XXX/YYY/ZZZ/https/sub.domain.com/xyz/xyz/xyz/xyz")
)).toDF("id", "url")
df
.select(regexp_replace($"url", "^(/\\w+){3}/(https?)/", "$2://").alias("url"))
.show(2, false)
// +--------------------------------------+
// |url |
// +--------------------------------------+
// |http://www.domain.com/xyz/xyz |
// |https://sub.domain.com/xyz/xyz/xyz/xyz|
// +--------------------------------------+
Run Code Online (Sandbox Code Playgroud)
在Spark 1.4中,您可以尝试Hive UDF:
df.selectExpr("""regexp_replace(url, '^(/\w+){3}/(https?)/','$2://') AS url""")
Run Code Online (Sandbox Code Playgroud)
如果说之前区间的数目http(s)可以改变你通过更换调整正则表达式{3}用*或范围.
| 归档时间: |
|
| 查看次数: |
3144 次 |
| 最近记录: |