Разбор pyspark dataframe - PullRequest
       10

Разбор pyspark dataframe

0 голосов
/ 16 февраля 2019

Я создал фрейм данных pyspark, как показано ниже:

df = spark.createDataFrame([([0.1,0.2], 2), ([0.1], 3), ([0.3,0.3,0.4], 2)], ("a", "b"))

df.show()

+---------------+---+
|              a|  b|
+---------------+---+
|     [0.1, 0.2]|  2|
|          [0.1]|  3|
|[0.3, 0.3, 0.4]|  2|
+---------------+---+

Теперь я пытаюсь проанализировать столбец 'a' по одной строке за раз, как показано ниже:

parse_col = udf(lambda row: [ x for x in row.a], ArrayType(FloatType()))

new_df = df.withColumn("a_new", parse_col(struct([df[x] for x in df.columns if x == 'a'])))

new_df.show()

Это отлично работает.

+---------------+---+---------------+
|              a|  b|          a_new|
+---------------+---+---------------+
|     [0.1, 0.2]|  2|     [0.1, 0.2]|
|          [0.1]|  3|          [0.1]|
|[0.3, 0.3, 0.4]|  2|[0.3, 0.3, 0.4]|
+---------------+---+---------------+

Но когда я пытаюсь отформатировать значения, как показано ниже:

count_empty_columns = udf(lambda row: ["{:.2f}".format(x) for x in row.a], ArrayType(FloatType()))

new_df = df.withColumn("a_new", count_empty_columns(struct([df[x] for x in df.columns if x == 'a'])))

new_df.show()

Не работает - отсутствуют значения

+---------------+---+-----+
|              a|  b|a_new|
+---------------+---+-----+
|     [0.1, 0.2]|  2|  [,]|
|          [0.1]|  3|   []|
|[0.3, 0.3, 0.4]|  2| [,,]|
+---------------+---+-----+

Я использую spark v2.3.1

Есть идеи, что я здесь не так делаю?

Спасибо

1 Ответ

0 голосов
/ 16 февраля 2019

Это просто - типы имеют значение.Вы объявляете вывод как array<string>, хотя отформатированная строка не является единицей.Следовательно, результат не определен.Другими словами, будучи строкой, а число с плавающей точкой является взаимоисключающим.

Если вы хотите строки, вы должны объявить столбец как таковой

udf(lambda row: ["{:.2f}".format(x) for x in row.a], "array<string>")

, в противном случае вам следует рассмотреть округление или использование чисел с фиксированной точностью.

df.select(df["a"].cast("array<decimal(38, 2)>")).show()
+------------------+                                                            
|                 a|
+------------------+
|      [0.10, 0.20]|
|            [0.10]|
|[0.30, 0.30, 0.40]|
+------------------+

хотя это совершенно разные операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...