Как заменить пробел в Spark (с помощью Scala)?
У меня есть файл журнала, как это. Я хочу создать DataFrame в Scala.
2015-05-13T23:39:43.945958Z my-loadbalancer 192.168.131.39:2817 10.0.0.1:80 0.000086 0.001048 0.001337 200 200 0 57 "GET https://www.example.com:443/ HTTP/1.1" "curl/7.38.0" DHE-RSA-AES128-SHA TLSv1.2
Я хочу заменить все пробелы запятыми, чтобы я мог использовать spark.sql, но я не могу этого сделать.
Вот все, что я пробовал:
- Сначала попытался импортировать его как текстовый файл, чтобы проверить, есть ли метод replaceAll.
- Пробовал расщепление на основе пространства.
Какие-либо предложения. Я просмотрел документацию, и там нет упоминания о функции замены, как в Pandas.
3 ответа
Вы можете просто сказать искре, что ваш разделитель - это пробел, как это:
val df = spark.read.option("delimiter", " ").csv("path/to/file")
Поскольку у вас еще нет набранных столбцов, я бы начал с RDD, разделил текст на карте, а затем преобразовал бы в Dataframe со схемой. Грубо говоря:
val rdd = sc.textFile({logline path}).map(line=>line.split("\\s+"))
Затем вам нужно превратить ваш RDD (где каждая запись является массивом токенов) в Dataframe. Самый надежный способ - сопоставить массивы с объектами Row, поскольку RDD [Row] - это то, что лежит в основе фрейма данных.
Более простой способ встать и идти, хотя будет
spark.createDataFrame(rdd).toDF("datetime", "host", "ip", ...)
Если вы просто хотите разделить пространство и сохранить строку в двойных кавычках, вы можете использовать библиотеку apache.commons.csv.
import org.apache.commons.csv.CSVParser._
val str = """2015-05-13T23:39:43.945958Z my-loadbalancer 192.168.131.39:2817 10.0.0.1:80 0.000086 0.001048 0.001337 200 200 0 57 "GET https://www.example.com:443/ HTTP/1.1" "curl/7.38.0" DHE-RSA-AES128-SHA TLSv1.2"""
val http = csv.CSVParser.parse(str,CSVFormat.newFormat(' ').withQuote('"')).getRecords.get(0).get(11)
val curl = csv.CSVParser.parse(str,CSVFormat.newFormat(' ').withQuote('"')).getRecords.get(0).get(12)
println(http)
println(curl)
Результаты:
GET https://www.example.com:443/ HTTP/1.1
curl/7.38.0