import pandas as pd
rate = spark.sql("SELECT C3, CAST(REPLACE(C4, '.','-') AS timestamp) AS `C4`, C5 from " + src_db_name + ".all_corw WHERE _UNITID = 'S01' AND CODAID = 'ALV'")
rate_pd = rate.toPandas()
print(rate_pd.dtypes)
def addVat(rsum, date, vatcd):
rate_final = rate_pd.loc[(rate_pd['C3']==str(vatcd))&(rate_pd['C4'] < date)].sort_values(by=['C4'], ascending=False)
if rate_final.empty:
result = rsum * Decimal(1 + 0/100)
else:
result = rsum * Decimal(1 + int(rate_final['C5'].iloc[0])/100)
return result
def removeVat(rsum, date, vatcd):
rate_final = rate_pd.loc[(rate_pd['C3']==str(vatcd))&(rate_pd['C4'] < date)].sort_values(by=['C4'], ascending=False)
if rate_final.empty:
result = rsum / Decimal(1 + 0/100)
else:
result = rsum / Decimal(1 + int(rate_final['C5'].iloc[0])/100)
return result
spark.udf.register(name = 'addVat_func', f = addVat, returnType=DecimalType())
spark.udf.register(name = 'removeVat_func', f = removeVat, returnType=DecimalType())
< /code>
Имеет проблемы с этим кодом, возвращая DateTime64 [ns] в качестве dtype C4, дополнительно вниз по коду в этом выборе запроса < /p>
select gb._unitid,max(gb.billd) billd,gs.vehiid,sum(removeVat_func(coalesce(gr.rsum,0),coalesce(gb.billd, cast('1900-01-01' as timestamp)),case when gr.vatcd = '' THEN '0' \
else gr.vatcd end)) summa \
from " + src_db_name + ".all_gbil gb inner join " + src_db_name + ".all_gsal gs on gb.gsalid=gs.gsalid and gb._unitid=gs._unitid \
inner join " + src_db_name + ".all_grow gr on gb.gsalid=gr.gsalid and gb.grecno=gr.grecno and gb._unitid=gr._unitid \
where gb.btype in (30,31,33) and (gr.PACKIDIN like '%GARDX%' OR gr.PACKIDIN like '%GARDEX%' OR gr.PACKIDIN like 'JLRGI') and gb._unitid in (select distinct unitid from unittbl) group by gb._unitid,gs.vehiid \
),
< /code>
При сохранении код сравнивает dtype of billd (timeStamp) и C4 (подчиняется от строки к временной метке), в конечном итоге, сталкивается с py4jjavaerror, когда таблица сохраняется. Как я могу гарантировать, что C4 объявляется DateTime DTYPE вместо DateTime64 [NS]. Пса Эта таблица сохраняется в Catalog_schema < /p>
< /p>
Task 1 in stage 4001.0 failed 4 times, most recent failure: Lost task 1.3 in stage 4001.0 (TID 13280) (10.139.64.120 executor 33): org.apache.spark.SparkRuntimeException: [UDF_USER_CODE_ERROR.GENERIC] Execution of function removeVat_func(coalesce(rsum#380619, 0.000000), coalesce(billd#380248, 1900-01-01 00:00:00), CASE WHEN (vatcd#380651 = ) THEN 0 ELSE vatcd#380651 END) failed. == Error == TypeError: Invalid comparison between dtype=datetime64[ns] and datetime
< /code>
Я старался избегать использования панд и вместо этого чисто используемый pyspark, но столкнулся с другой ошибкой, в которой говорится, что предоставленная логика может пройти только через драйвер. Ожидаемое должно быть DTYPE C4 возвращается с DateTime, чтобы, когда мы сохраняем таблицу, C4 и Billd проходили сравнение DTYPE.
Подробнее здесь: https://stackoverflow.com/questions/794 ... dtype-body
Столбец DTYPE возвращающий DateTime64 [NS] сравнивается с телом DateTime DTYPE ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Pandas, как передать dtype datetime64 в запросе, не вызывая предупреждения в будущем
Anonymous » » в форуме Python - 0 Ответы
- 23 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Pandas, как передать dtype datetime64 в запросе, не вызывая предупреждения в будущем
Anonymous » » в форуме Python - 0 Ответы
- 17 Просмотры
-
Последнее сообщение Anonymous
-