Как заменить пробел в Spark (с помощью Scala)? - PullRequest
0 голосов
/ 26 ноября 2018

У меня есть такой файл журнала.Я хочу создать 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 ]

0 голосов
/ 27 ноября 2018

Вы можете просто сказать искре, что ваш разделитель - это пробел, как это:

val df = spark.read.option("delimiter", " ").csv("path/to/file")
0 голосов
/ 27 ноября 2018

Если вы просто хотите разделить пробел и сохранить строку в двойных кавычках, вы можете использовать библиотеку 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
0 голосов
/ 27 ноября 2018

Поскольку у вас еще нет набранных столбцов, я бы начал с 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", ...)
...