Как извлечь таблицы с данными из дампа .sql с помощью Spark? - PullRequest
0 голосов
/ 31 августа 2018

У меня есть около четырех * .sql автономных дампов (около 20 ГБ каждый), которые мне нужно преобразовать в наборы данных в Apache Spark.

Я попытался установить и создать локальную базу данных с использованием InnoDB и импортировать дамп, но это кажется слишком медленным (потратил на это около 10 часов)

Я напрямую считываю файл в искру, используя

import org.apache.spark.sql.SparkSession

var sparkSession = SparkSession.builder().appName("sparkSession").getOrCreate()
var myQueryFile = sc.textFile("C:/Users/some_db.sql")

//Convert this to indexed dataframe so you can parse multiple line create / data statements. 
//This will also show you the structure of the sql dump for your usecase.

var myQueryFileDF = myQueryFile.toDF.withColumn("index",monotonically_increasing_id()).withColumnRenamed("value","text") 


// Identify all tables and data in the sql dump along with their indexes

var tableStructures = myQueryFileDF.filter(col("text").contains("CREATE TABLE"))
var tableStructureEnds = myQueryFileDF.filter(col("text").contains(") ENGINE"))

println(" If there is a count mismatch between these values choose different substring "+ tableStructures.count()+ " " + tableStructureEnds.count())

var tableData = myQueryFileDF.filter(col("text").contains("INSERT INTO "))

Проблема в том, что дамп также содержит несколько таблиц, каждая из которых должна стать набором данных. Для чего мне нужно понять, сможем ли мы сделать это хотя бы для одного стола. Есть ли какой-нибудь парсер .sql, написанный для scala spark?

Есть ли более быстрый способ сделать это? Могу ли я прочитать его непосредственно в куст из автономного файла .sql?

ОБНОВЛЕНИЕ 1: я пишу синтаксический анализатор для этого на основе входных данных Ajay

ОБНОВЛЕНИЕ 2: изменение всего кода на набор данных для использования синтаксического анализатора SQL в соответствии с предложением

Ответы [ 2 ]

0 голосов
/ 01 сентября 2018

Есть ли какой-нибудь синтаксический анализатор, написанный для scala spark?

Да, есть, и вы, кажется, уже используете его. Это сам Spark SQL! Удивлены?

Интерфейс синтаксического анализатора SQL (ParserInterface) может создавать реляционные сущности из текстового представления оператора SQL. Это почти ваш случай, не так ли?

Обратите внимание, что ParserInterface имеет дело с одним оператором SQL за раз, поэтому вам придется каким-то образом проанализировать все дампы и найти определения и строки таблицы.

ParserInterface доступен как sqlParser из SessionState.

scala> :type spark
org.apache.spark.sql.SparkSession

scala> :type spark.sessionState.sqlParser
org.apache.spark.sql.catalyst.parser.ParserInterface

Spark SQL поставляется с несколькими методами, которые предлагают точку входа в интерфейс, например SparkSession.sql, Dataset.selectExpr или просто expr стандартная функция. Вы также можете использовать синтаксический анализатор SQL напрямую.


бесстыдный плагин Возможно, вы захотите прочитать о ParserInterface - Контракт парсера SQL в книге Mastering Spark SQL.

0 голосов
/ 31 августа 2018

Вам нужно разобрать это самостоятельно. Требуются следующие шаги -

  1. Создать класс для каждой таблицы.
  2. Загрузка файлов с использованием textFile.
  3. Отфильтровать все операторы, кроме операторов вставки.
  4. Затем разделите СДР с помощью фильтра на несколько СДР на основе имени таблицы, присутствующего в операторе вставки.
  5. Для каждого СДР используйте карту для анализа значений, присутствующих в операторе вставки, и создания объекта.
  6. Теперь преобразуйте RDD в наборы данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...