Nano Hash - криптовалюты, майнинг, программирование

как передать правила преобразования MultipleColumns из XML-файла в Dataframe в Spark?

У меня есть файл XML, содержащий все преобразования, которые мне нужно выполнить для DataFrame с помощью функции withColumn, как показано ниже: Как я могу применить его к DataFrame.

У меня был написанный код с использованием Scala ToolBox и runTmirror, которые внутренне компилируют код и запускают эти правила поверх DataFrame. Что отлично работало менее чем для 100 столбцов. Но теперь требование было изменено, и количество столбцов увеличилось с 80 до 210, поэтому этот код не работает из-за StackOverflow error. Что является открытой проблемой для Scala 2.11 (https://github.com/scala/bug/issues/10026)

Поэтому я хочу использовать любую утилиту Spark вместо Scala ToolBox. Я также пытался использовать foldLeft, но это также дает ошибку, так как я не могу передать функцию столбца (например, lit или concat и т. д.) в качестве типа столбца.

Файлы правил XML:

    <?xml version="1.0" encoding="utf-8" ?> 
    - <root>
    - <columns>
    - <column name="col1">
    - <![CDATA[ data("columnA")        
      ]]> 
      </column>
    - <column name="col2">
    - <![CDATA[lit("ABC")

      ]]> 
      </column>
    - <column name="col3">
    - <![CDATA[concat(col(columnC),col(columnD))      
      ]]> 
      </column>
      </column>
    - <column name="col4">
    - <![CDATA[         regexp_replace(regexp_replace(regexp_replace(col("ColumnE"), "\\,|\\)", "") , "\\(", "-") , "^(-)$", "0").cast("double")

      ]]> 
      </column>
    - <column name="col5">
    - <![CDATA[                 lit("")

      ]]> 
      </column>
.
.
.
.
. 
     </columns>
      </root>

Операции, которые мне нужно использовать как

df.withColumn("col1",data("columnA")).withColumn("col2",lit("ABC")).withColumn("col3",concat(col(columnC), col(columnD))).withColumn("col4",regexp_replace(regexp_replace(regexp_replace(col("ColumnE"), "\\,|\\)", "") , "\\(", "-") , "^(-)$", "0").cast("double"))withColumn("col5",lit("")).........

Версия, которую я использую:

Скала 2.11.12

Искра 2.4.3


  • Можете ли вы предоставить код и ошибку, которую вы получили с foldLeft? Я думаю, что это должен быть правильный способ сделать это. Что-то вроде scala colsFromXML.foldLeft(df, newColMap) { df => df.withColumn(newColMap("name"), newColMap("colExpr") } Вероятно, вам нужно будет немного препроцессировать xml, но я не вижу, где вам нужно иметь тип данных результирующего столбца 01.09.2019
  • Спасибо за ответ, я попытался прочитать файл XML и сопоставить его со списком как (col1, (concat (col2, col3)) и использовать его как-то вроде list.foldLeft (DF, listmap) {DF.withColumn (listmap (0), listmap(1))}. Я знал, что я читаю метод, такой как concat, и освещаю как String из Xml, поэтому он дает ошибку, которая нашла String , требуемый тип столбца (который в основном является типом освещенной и другой функции столбца). Если вы можете помочь мне прочитать файл XML, отформатированный, как указано выше, и использовать его, как я уже упоминал.Если это невозможно, не могли бы вы предоставить мне более подробную информацию, например, что такое colsFromXML и как он на самом деле работает.. 01.09.2019
  • хорошо, я вижу проблему, вам в основном нужно интерпретировать строку, которую вы получаете из xml, как код. Это можно сделать, как в этом ответе stackoverflow.com/questions /39142979/. Если для вас слишком сложно оценивать строки как код, вам может потребоваться написать какой-то собственный синтаксический анализатор, который распознает функции spark.sql.function и возвращает правильные выражения столбца. Это явно много работы 01.09.2019
  • Спасибо, Пол, я проверил stackoverflow.com/questions/39142979/…. и обнаружил, что моя существующая система имеет ту же логику (с использованием ToolBox), что и в ответе. Что также работает, но, как я упоминал в описании, этот метод выдает ошибку StackOverFlow, когда мы работаем с более чем 100 столбцами (github.com/scala/bug/issues/10026). Вот почему я искал Spark Solution вместо Scala. Без сомнения, у меня есть возможность использовать Spark SQL и запустить его, но это будет сложно. Итак, наконец, я решил использовать логику, которую я дал в ответе, и она отлично работает. 02.09.2019

Ответы:


1

Я пытался получить решение от Spark, но не получил никакого решения, кроме Spark Sql. Но мои правила очень сложны, и использование Spark Sql усложнит их, поэтому я придерживался той же логики ToolBox (как и работа существующей системы) и решил проблему со 100 столбцами, как показано ниже:

  1. Сначала я читаю все правила из XML и генерирую CodeRule с помощью concat с .withColumn (так же, как существующий код).
  2. Затем я проверяю наличие строки ".withColumn", если она больше 100 (скажем, 133 столбца), затем просто делю CodeRule на две части (одна от 1 до 99, правило FirstRule и правило секунд от 100 до 133, LastRule) и примените эти правила в два этапа, как показано ниже
  3. сначала примените FirstRule к входу DataFrame и получите DataFrame.
  4. После этого я передаю полученное Dataframe с LastRule и получаю окончательное DataFrame.
  5. Он отлично работает для моего случая.
02.09.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..