Как заменить пробел в 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, но я не могу этого сделать.

Вот все, что я пробовал:

  1. Сначала попытался импортировать его как текстовый файл, чтобы проверить, есть ли метод replaceAll.
  2. Пробовал расщепление на основе пространства.

Какие-либо предложения. Я просмотрел документацию, и там нет упоминания о функции замены, как в 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
Другие вопросы по тегам