Спецификации выбора разрешения динамического кадра, приведение даты

Я пишу код Glue и использую динамический выбор разрешения Api фрейма, спецификации. Я пытаюсь выполнить приведение источника, передавая приведение, когда динамический фрейм создается из каталога. Я успешно реализовал приведение с помощью спецификаций выбора разрешения, но во время литья я получаю нулевые значения, просто хотел понять, как мы можем передать дату с исходным форматом при литье. self.df_TR01=self.df_TR01.resolveChoice(specs=[('col1', 'cast"string'), ('col2_date', 'cast:date')]).toDF()

Но в col2_date я получаю нулевое значение, и я пытаюсь понять, как передать дату с исходным форматом в приведенном выше заявлении.


person Anaadih.pradeep    schedule 29.06.2020    source источник


Ответы (1)


Я столкнулся с чем-то похожим, но моя проблема раньше при написании дат в Redshift, они также приземлялись как нулевые. В моем случае я использовал следующее, и это помогло мне решить проблему. Может это поможет.

from datetime import datetime

def fix_dates(m):
    m["col2"] = datetime.strptime(m["col2"],  "m/d/yy")
    return m

custommapping1 = Map.apply(frame = datasource0, f = fix_dates, transformation_ctx = "custommapping1")

В качестве альтернативы вы можете использовать искру sql, например:

datasource0.toDF().createOrReplaceTempView("my_temp_view")

df_cols  = spark.sql("""
  select to_date(cast(unix_timestamp(col2, 'M/d/yy') as timestamp)) as col2 from my_temp_view """)

ResolveChoice обычно справляется с большинством двусмысленностей. Не могли бы вы поделиться пробной датой, которая не может быть правильно приведена, может быть, я мог бы также попробовать со своей стороны.

person Eman    schedule 29.06.2020
comment
Спасибо Эману за ответ. Я понимаю вашу точку зрения, но что использовать resolvechoice, поскольку я применяю приведение к самым первым исходным файлам. self.df_TR01 = self.df_TR01.resolveChoice (specs = [('col1', 'caststring'), ('col2_date', 'cast: date')]). toDF () - person Anaadih.pradeep; 30.06.2020
comment
Может быть, если вы расскажете, как col2_date выглядит с точки зрения значений, я мог бы попытаться заставить это работать - person Eman; 30.06.2020
comment
это похоже на 20121202 означает год, месяц и число - person Anaadih.pradeep; 30.06.2020
comment
Насколько я понимаю, DateType в искре - это все, что поддерживает от 0001-01-01 до 9999-12-31. В остальном вам придется поработать с параметрами, позволяющими форматировать дату. - person Eman; 30.06.2020
comment
Да, я ищу возможность передать формат даты источника через resolveChoice - person Anaadih.pradeep; 01.07.2020
comment
Я думаю, что Cast не сможет этого сделать, аналогично моему примеру выше. Вы можете использовать приведенный ниже пример: func = udf (lambda x: datetime.strptime(x, '%Y%M%d'), DateType()) cast_df = df.withColumn("new_date", func(col('date'))) cast_df.show() +------+--------+----------+ | colA| date| new_date| +------+--------+----------+ | 0|20121202|2012-01-02| | 23|20121202|2012-01-02| - person Eman; 01.07.2020