Условно заполнить новый столбец в кадре данных искры на основе содержимого, извлеченного с помощью регулярного выражения другого столбца. - PullRequest
0 голосов
/ 24 января 2019

У меня есть фрейм данных spark, который содержит содержимое файла json.Мне нужно создать новый столбец, который заполняется условно на основе содержимого другого столбца.

Допустим, у меня есть столбец, содержащий некоторые числа, и мой новый столбец будет заполняться в зависимости от значения этих номеров (например,: первый столбец имеет номер меньше 5, мой новый столбец будет заполнен строкой «меньше пяти», если значение больше 5, новый столбец будет заполнен значением «больше пяти).

Я знаю, что могу сделать что-то подобное с помощью функции when:

file.withColumn('newcolumn', \
                F.when(file.oldColumn < 5, 'Lower than five') \
                .when(file.oldColumn > 5, 'Greater than five').show()

, но что если в 'oldColumn' нет только целых чисел, но он содержит строку, из которой мне нужно извлечь целое число:

например, «PT5M», и мне нужно извлечь 5, и мне нужно рассмотреть строку типа «PTM», которая не содержит число как 0

Пока мне удается извлечь число длямой первый столбец с использованием regexp_extract, но я пытаюсь превратить нулевые значения в пример 0

, где 1 - исходный столбец, а 2 -новый столбец:

+-------+-------------------+
|1      |  2                |
+-------+-------------------+
|PT5M   |  Lower than five  |   
|PT10M  |  Greater than five|    
|PT11M  |  Greater than five|        
+-------+-------------------+

Спасибо за помощь!

Ответы [ 3 ]

0 голосов
/ 24 января 2019

Есть много способов

scala> val df = Seq("PT5M","PT10M","PT11M").toDF("a")
df: org.apache.spark.sql.DataFrame = [a: string]

scala> df.show(false)
+-----+
|a    |
+-----+
|PT5M |
|PT10M|
|PT11M|
+-----+

scala> df.withColumn("b",regexp_extract('a,"""\D*(\d+)\D*""",1)).show(false)
+-----+---+
|a    |b  |
+-----+---+
|PT5M |5  |
|PT10M|10 |
|PT11M|11 |
+-----+---+


scala> df.withColumn("b",regexp_extract('a,"""\D*(\d+)\D*""",1)).withColumn("c", when('b.cast("int") < 5, "Lower than five").when('b.cast("int") > 5, "Greater than five").otherwise("null")).show(false)
+-----+---+-----------------+
|a    |b  |c                |
+-----+---+-----------------+
|PT5M |5  |null             |
|PT10M|10 |Greater than five|
|PT11M|11 |Greater than five|
+-----+---+-----------------+


scala>

Если в значении нет цифр и вы хотите установить значение по умолчанию 0, вы можете использовать coalesce ()

scala> val df = Seq("PT5M","PT10M","PT11M", "XXM").toDF("a")
df: org.apache.spark.sql.DataFrame = [a: string]

scala> df.show
+-----+
|    a|
+-----+
| PT5M|
|PT10M|
|PT11M|
|  XXM|
+-----+


scala> df.withColumn("b",coalesce(regexp_extract('a,"""\D*(\d+)\D*""",1).cast("int"),lit(0))).withColumn("c", when('b < 5, "Lower than five").when('b > 5, "Greater than five").otherwise("null")).show(false)
+-----+---+-----------------+
|a    |b  |c                |
+-----+---+-----------------+
|PT5M |5  |null             |
|PT10M|10 |Greater than five|
|PT11M|11 |Greater than five|
|XXM  |0  |Lower than five  |
+-----+---+-----------------+


scala>
0 голосов
/ 24 января 2019
from pyspark.sql.functions import regexp_extract, when
myValues = [('PT5M',),('PT10M',),('PT11M',),('PT',)]
df = sqlContext.createDataFrame(myValues,['1'])
df.show()
+-----+
|    1|
+-----+
| PT5M|
|PT10M|
|PT11M|
|   PT|
+-----+

df = df.withColumn('interim',regexp_extract(df['1'],'\d+',0))
df = df.withColumn('2', when(df['interim'] < 5, 'Lower than five').when(df['interim'] > 5, 'Greater than five').when(df['interim']=='','Lower than five')).drop('interim')
df.show()
+-----+-----------------+
|    1|                2|
+-----+-----------------+
| PT5M|             null|
|PT10M|Greater than five|
|PT11M|Greater than five|
|   PT|  Lower than five|
+-----+-----------------+
0 голосов
/ 24 января 2019

Использование regexp_replace для замены нечисловых значений пустыми строками, а затем использование when для установки значения столбца.

file.withColumn('newcolumn', \
                F.when(F.regexp_replace(file.oldColumn,'[^0-9]','') == '','Lower than five')\ 
                 .when(F.regexp_replace(file.oldColumn,'[^0-9]','').cast('int') < 5, 'Lower than five') \
                 .otherwise('Greater than five')).show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...