我正在尝试将以下格式的一些示例日志文件解析为Spark DataFrame。
66.249.69.97 - - [24/Sep/2014:22:25:44 +0000] "GET /071300/242153 HTTP/1.1" 404 514 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)"
71.19.157.174 - - [24/Sep/2014:22:26:12 +0000] "GET /error HTTP/1.1" 404 505 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/37.0.2062.94 Safari/537.36"
我按空格分割,然后拉出不同的字段(下面是我的代码)。但是,遇到用户代理字段时会遇到麻烦,因为当用空格分隔时,它可能是可变数量的字段(基本上是引用网址之后的所有内容)。有没有一种方法可以使用getItem()
在某个索引之后提取所有剩余的项目?还是有更好的方法呢? (我对Spark还是很陌生)。
import org.apache.spark.sql.functions._
var logs = spark.read.textFile("my_log_file.txt")
var splitLogs = logs.map(line => line.replace("\"", ""))
.map(line => line.replace("[", ""))
.map(line => line.split(" "))
.withColumn("ip", col("value").getItem(0))
.withColumn("date", col("value").getItem(3))
.withColumn("request_type", col("value").getItem(5))
.withColumn("requested_url", col("value").getItem(6))
.withColumn("status_code", col("value").getItem(8))
.withColumn("bytes_transferred", col("value").getItem(9))
.withColumn("referrer_url", col("value").getItem(10))
.withColumn("browser", concat_ws(" ",
col("value").getItem(11),
col("value").getItem(12),
col("value").getItem(13),
col("value").getItem(14)))