Spark - смешанная чувствительность к регистру в Spark DataFrame, Spark SQL и / или таблице блоков данных - PullRequest
0 голосов
/ 01 сентября 2018

У меня есть данные с SQL Server, которыми я должен манипулировать в Apache Spark (блоки данных).

В SQL Server три ключевых столбца этой таблицы используют параметр COLLATION с учетом регистра, так что эти конкретные столбцы чувствительны к регистру, а другие в таблице - нет. Эти столбцы являются короткими буквенно-цифровыми идентификаторами из приложения поставщика, и мы должны иметь возможность использовать их с учетом регистра в предикатах и ​​условиях соединения, а также использовать другие без учета регистра.

Таблица была экспортирована как CSV.

Есть ли способ смешать сравнения столбцов с учетом регистра и без учета регистра в DataFrame, кроме использования нижних и верхних функций? Я также могу импортировать этот CSV-файл в таблицу блоков данных, но, похоже, он не предлагает аналогичные параметры сортировки на уровне метаданных для объединений.

Спасибо.

1 Ответ

0 голосов
/ 20 октября 2018

В Spark 2.x такой опции нет.

Если вам нужно сохранить регистр данных для последующей обработки, но вам также нужно сравнение без учета регистра, у вас есть три варианта:

  1. Создание видов с дополнительными столбцами, которые представляют собой прописные / строчные буквы. Это лучший вариант, если вы используете исключительно SparkSQL. Я бы не рекомендовал материализовать дополнительные столбцы для операций без учета регистра в постоянных данных: дополнительная стоимость ввода-вывода, вероятно, перевесит цену ЦП для изменения регистра.

  2. Если вы используете Spark DSL, вы можете создавать абстракции, которые проясняют ваши намерения без лишней дополнительной типизации и без необходимости создавать новые столбцы / представления, например, вводить нечувствительные к регистру (не) операторы равенства и сравнения если вы используете Scala.

    df.where('x ciLT 'y) // ciLT is case-insensitive less than, as an example

  3. В зависимости от того, сколько кода вам нужно написать, какие операции требуют сортировки без учета регистра и языка, который вы используете, вы можете получить довольно причудливую информацию, например, автоматически переписывать выражения так, чтобы (в) операторы равенства и сравнения вести себя чувствительно к регистру или нечувствительным образом на основе имени таблицы. Это требует глубокого понимания внутренних особенностей Spark и имеет смысл, только если вам приходится управлять большой кодовой базой с высокой скоростью кода.

Если вы в основном используете операции без учета регистра в WHERE и ORDER/SORT BY, производительность будет довольно хорошей, поскольку строки данных не будут расширяться для обработки. В противном случае столбцы будут «материализованы» во внутренних строках Spark, что приведет к небольшому снижению производительности.

Если вам не нужно, чтобы регистр данных сохранялся для последующей обработки, правильный подход к представлению общего регистра во время приема - это

...