在Spark中串联任意数量的拆分列

时间:2019-07-10 11:22:20

标签: scala apache-spark

我正在尝试将以下格式的一些示例日志文件解析为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)))

0 个答案:

没有答案