Я пытаюсь проанализировать некоторые примеры файлов журнала в формате ниже в 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"
Я делю по пробелам, а затем вытаскиваю различные поля (мой код ниже),Тем не менее, я сталкиваюсь с неприятностями, когда добираюсь до поля агента пользователя, потому что, когда оно разделено пробелами, оно может быть переменным числом полей (это в основном все после URL-адреса реферера).Есть ли способ использовать 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)))