У меня есть файл, который содержит такие записи, как,
Ввод (необработанная запись журнала):
50.57.190.149 - - [22 / апр / 2012: 07: 12: 41 +0530] "GET /computers/laptops.html?brand=819 HTTP / 1.0" 200 12530 "-" "-"
Выход (обработанная запись журнала):
50.57.190.149 - - 22 / апр / 2012: 07: 12: 41 +0530 GET /computers/laptops.html?brand=819 компьютеры HTTP / 1.0 - - laptops.html
марка = 819 200 12530 - -
Формат входных данных:
- удаленный IP
- удаленный лог-имя
- Пользователь
- время
- запрос строка
- статус-код
- байт-строка
- агент пользователя
- направление
вот мой код:
object unStructuredToStructured {
def main(args : Array[String]){
val spark = SparkSession.builder().appName("unStructuredToStructured").master("local[*]").getOrCreate()
import spark.implicits._
val rdd1 = spark.read.textFile("C:\\Users\\LENOVO\\Downloads\\Veeresh_study\\DataSet_from_OldSessions\\weblogs\\weblogs_1_rec.txt").rdd
val schemaString = "remote_IP remote_log_name user time request_string status_code byte_string user_agent referral"
val fields = schemaString.split(" ")
.map(fieldName => StructField(fieldName, StringType, nullable = true))
val schema = StructType(fields)
val rowRDD = rdd1.map(x => x.split(" "))
.map(attributes => Row(attributes(0), attributes(1), attributes(2), attributes(3), attributes(4), attributes(5), attributes(6), attributes(7), attributes(8)))
val data = spark.createDataFrame(rowRDD, schema)
data.show()
}
}
Выход:
Вот вывод, который я получаю
Как видно из изображения,
мы используем пробел в качестве удалителя и значение одного поля разбивается на несколько столбцов (поскольку значение-поле содержит пробел в нем)
ex: В идеале столбец " time " должен иметь значение " [22 / Apr / 2012: 07: 12: 41 +0530] ", но здесь он разбивается на два столбца, например " time " и " request_string "
аналогично значение request_string ("GET /computers/laptops.html?brand=819 HTTP / 1.0") разделяется на " status_code ", " byte_string"и " user_agent"
помогите разобрать значения полей, игнорируя пробел внутри значения поля