Python as_dict () преобразование десятичных значений 0,0 в десятичные (0) - PullRequest
0 голосов
/ 03 августа 2020

У меня есть искровый фрейм данных, который я пытаюсь преобразовать в список словаря. Для этого я делаю:

list(map(lambda row: row.asDict(), df.collect()))

Но это преобразование некоторых десятичных значений в кадре данных из 0.0 в decimal(0).

Ожидается:

[{'Name': 'John','Weight': 0.0, '_id': '0010z00001aZa0RAAS'}]

Фактическое:

[{'Name': 'John','Weight': Decimal('0'), '_id': '0010z00001aZa0RAAS'}]

РЕДАКТИРОВАТЬ :

Мне это нужно, потому что я должен передать этот точный список в MongoDB для хранения , а PyMon go не поддерживает Decimal('0') и выдает ошибку, как показано ниже:

MongoDB ERROR: data not inserted: cannot encode object: Decimal('0'), of type: <class 'decimal.Decimal'>

Также я попытался преобразовать искру df в pandas df как json.loads(df.toPandas().T.to_json())).values() получить словарь. Но этот подход кажется очень медленным.

Что мне не хватает? Я новичок в этом. Спасибо за любую помощь

1 Ответ

0 голосов
/ 03 августа 2020

Ahalya, я думаю, вы можете добиться этого, преобразовав вес в float из десятичного

для [{'Name': 'John','Weight': 0.0, '_id': '0010z00001aZa0RAAS'}] вот пример кода:

from pyspark.sql.functions import col

df = ...
df = df.withColumn("weight", col("weight").cast("float"))
df_dict = list(map(lambda row: row.asDict(), df.collect()))

вместо этого вы получите 0,0 of Decimal (0,0)

EDIT 1: если вам нужно проверить десятичные столбцы и динамически преобразовать их:

column_schema = df.dtypes
for cols in column_schema:
    if 'decimal' in cols[1]:
        df = df.withColumn(cols[0], col(cols[0]).cast("float")) 

Объяснение: в columns_schema вы собираете имя_столбца, тип данных как список ( кортеж (столбец, тип данных)) из фрейма данных. Позже вы l oop dataframe с column_schema и приведете столбцы, которые имеют тип данных decimal (0,0), в float.

Я согласен, что это грубый способ сделать, но я просто предлагаю вам подход , вы можете улучшить это. Надеюсь, это поможет!

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