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

Scala Regex UDF для захвата значений параметров запроса и преобразования их в список с разделителями-запятыми.

У меня есть данные, которые выглядят примерно так:

one=1&two=22222&three=&four=4f4

Как видите, значение переменной three отсутствует. Я хотел бы использовать Scala Regex, чтобы захватить все значения и вернуть их через запятую.

Желаемый результат:

1,22222,,4f4

Другой, более желательный, возможный результат:

1,22222,undefined,4f4

Это мой текущий код (я использую scala со Spark 2.0 для кадра данных):

def main(args: Array[String]) {
  ...
  val pattern : scala.util.matching.Regex = """[^&?]*?=([^&?]*)""".r
  df.select(transform(pattern)($"data").alias("csvData")).take(100).foreach(println)
}

def transform(pattern: scala.util.matching.Regex) = udf(
 (dataMapping: String) => pattern.findAllIn(dataMapping).toList
)

Что возвращает:

[WrappedArray(one=1, two=22222, three=, four=4f4)]
[WrappedArray(...)]

Я думаю, что могу лучше справиться с моей функцией «преобразования» udf, но я очень новичок в Scala и не знаю, как просто сопоставить первые группы и вернуть их через запятую. Я бы предположил, что в своем решении я бы использовал что-то вроде m => m.group(1), но я не уверен. Спасибо вам за ваши предложения.


Ответы:


1

Если у вас есть несколько столбцов, вам, вероятно, лучше всего использовать UDF:

scala> val df = Seq(("one=1&two=22222&three=&four=4f4", 1)).toDF("a", "b")
df: org.apache.spark.sql.DataFrame = [a: string, b: int]

scala> df.show
+--------------------+---+
|                   a|  b|
+--------------------+---+
|one=1&two=22222&t...|  1|
+--------------------+---+

scala> val p = """[one|two|three|four]\=([\d|\W|\w]+)""".r
p: scala.util.matching.Regex = [one|two|three|four]\=([\d|\W|\w]+)

scala> :pa
// Entering paste mode (ctrl-D to finish)

val regexUDF = udf( (x: String) =>
    x.split("&").map(p.findFirstMatchIn(_).map(_.group(1)).getOrElse(null)))
    )

// Exiting paste mode, now interpreting.

regexUDF: org.apache.spark.sql.expressions.UserDefinedFunction = UserDefinedFunction(<function1>,ArrayType(StringType,true),Some(List(StringType)))

scala> val df2 = df.withColumn("a", regexUDF($"a"))
df2: org.apache.spark.sql.DataFrame = [a: array<string>, b: int]   

scala> df2.show
+--------------------+---+
|                   a|  b|
+--------------------+---+
|[1, 22222, null, ...|  1|
+--------------------+---+


scala> df2.collect.foreach{println}
[WrappedArray(1, 22222, null, 4f4),1]
14.11.2016
  • Есть ли способ иметь только 1, 22222... в столбце значений вместо включения имен столбцов и знаков =? 15.11.2016
  • Кроме того, если в кадре данных много столбцов, как мне указать, что я хочу разделить столбец с именем данные? 15.11.2016
  • Мне очень нравится, куда вы идете с этим последним примером. При запуске получаю ошибку script.scala:43:error: not found: value p. 15.11.2016
  • Вам понадобится шаблон регулярного выражения, который я определил ранее. Если это распределенный кластер, вам может потребоваться широковещательная передача шаблона. Оставайтесь с нами, я работаю над улучшением синтаксического анализа регулярных выражений. 15.11.2016
  • можно ли было бы поделиться со мной кодом в методе преобразования, если бы я хотел сохранить все остальное таким же, только изменив детали между скобками udf? Я немного упростил свой пример, и у меня возникли проблемы с преобразованием ваших примеров в мой код. 15.11.2016
  • Добавлена ​​улучшенная обработка регулярных выражений. Я не совсем понимаю, о чем вы спрашиваете, мое отображение String => Array в udf не работает должным образом? 15.11.2016
  • Давайте продолжим обсуждение в чате. 15.11.2016
  • Новые материалы

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

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

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

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

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

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

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