Нулевая замена отсутствующих значений в файле JSON для Pyspark - PullRequest
0 голосов
/ 16 января 2020

JSON будет выглядеть так, как указано ниже.

{
"ThresholdTime": "48min", 
"FallTime": "Min", 
"description": "PowerAmplifier"
}
{
"ThresholdTime": "min", 
"FallTime": "200min", 
"description": "DolbyDigitall"
}

Я использую regexp_extract для удаления буквенного символа из строки alphanumeri c.

df.withColumn("NewThresholdTime",regexp_extract("ThresholdTime","(\\d+)",1))

Как Могу ли я добавить 0, когда нет времени для ThresholdTime или FallTime?

Вывод должен быть:

+--------+-------------+--------------+----------------+    
|FallTime|ThresholdTime|   NewFallTime|NewThresholdTime|    
+--------+-------------+--------------+----------------+    
|   Min  |        48min|0             |          48    |
|  200min|          min|200           |          0     |    
+--------+-------------+--------------+----------------+

1 Ответ

1 голос
/ 16 января 2020

Предполагая, что у нас есть фрейм данных со значениями, предоставленными в JSON, вы можете проверить, если столбец без цифр остался прежним, то оставить без изменений, иначе удалите алфавиты.

df = sqlContext.createDataFrame(
    [{"ThresholdTime": "48min", 
      "FallTime": "15Min", 
      "description": "PowerAmplifier"
    },
    {"ThresholdTime": "min", 
     "FallTime": "200min", 
     "description": "DolbyDigitall"}])

# What would column look like without alhpabets
col_without_alphabets = F.regexp_replace(df["ThresholdTime"], "[a-zA-Z]", "")

# What would column look like without numerals
col_without_numerals = F.regexp_replace(df["ThresholdTime"], "[0-9]", "")

# If without numerals the column remains the same then keep as-is, else remove alphabets
df.withColumn("NewThresholdTime",
              F.when(col_without_numerals == df["ThresholdTime"], 
                     F.lit(0))
              .otherwise(col_without_alphabets)).show()

Вывод :

+--------+-------------+--------------+----------------+
|FallTime|ThresholdTime|   description|NewThresholdTime|
+--------+-------------+--------------+----------------+
|   15Min|        48min|PowerAmplifier|              48|
|  200min|          min| DolbyDigitall|               0|
+--------+-------------+--------------+----------------+

Добавление ответа для расширения одинакового для любого количества переменных.

L oop через любые переменные, для которых вы хотите сделать то же самое для.

new_columns = list()
for column in ["ThresholdTime", "FallTime"]:

    # What would column look like without alphabets
    col_without_alphabets = F.regexp_replace(df[column], "[a-zA-Z]", "")

    # What would column look like without numerals
    col_without_numerals = F.regexp_replace(df[column], "[0-9]", "")

    # If without numerals the column remains the same then keep as-is, else remove alphabets
    new_columns.append(F.when(col_without_numerals == df[column], 
                        F.lit(0)).otherwise(col_without_alphabets).alias("New{}".format(column)))

df.select(["*"] + new_columns).show()

Выход:

+--------+-------------+--------------+----------------+-----------+
|FallTime|ThresholdTime|   description|NewThresholdTime|NewFallTime|
+--------+-------------+--------------+----------------+-----------+
|   15Min|        48min|PowerAmplifier|              48|         15|
|  200min|          min| DolbyDigitall|               0|        200|
+--------+-------------+--------------+----------------+-----------+
...