Я нашел обходной путь для этого, используя функцию to_utc_timestamp в pyspark, однако не совсем уверен, является ли это наиболее эффективным, хотя, похоже, он отлично работает на примерно 100 млн строк данных. Вы можете избежать regex_replace, если ваша строка метки времени выглядела так - 1997-02-28 10: 30: 40.897748
from pyspark.sql.functions import regexp_replace, to_utc_timestamp
df = spark.createDataFrame([('19970228-10:30:40.897748',)], ['new_t'])
df = df.withColumn('t', regexp_replace('new_t', '^(.{4})(.{2})(.{2})-', '$1-$2-$3 '))
df = df.withColumn("time", to_utc_timestamp(df.t, "UTC").alias('t'))
df.show(5,False)
print(df.dtypes)
Единственная конвенция состоит в том, что Вы возвращаетесь 0 для успеха и чего-то другого, чем нуль для ошибки. Самые известные программы Unix документируют различные коды возврата, которые они могут возвратить и Вы - также. Это не имеет большой смысл попытаться войти в общий список для всех возможных кодов ошибок, которые могла возвратить любая произвольная программа, или иначе Вы заканчиваете с десятками тысяч их как некоторая другая ОС, и даже затем, это не всегда покрывает определенный тип ошибки, которую Вы хотите возвратить.
Поэтому просто будьте последовательны, и будьте обязательно зарегистрировать безотносительно схемы, которую Вы решаете использовать.
1-127 доступный диапазон. Что-либо более чем 127, как предполагается, являются "аварийным" выходом - завершенный сигналом.
В то время как Вы в нем, рассматриваете использование stdout, а не кода выхода. Код выхода по традиции, раньше указывал на успех, отказ, и может быть еще одно состояние. Вместо того, чтобы использовать код выхода, попытайтесь использовать stdout, путь expr и туалет используют его. Можно затем использовать обратную галочку или что-то подобное в вызывающей стороне для извлечения результата.
состояния манифеста Unix -
Выход настолько скоро и столь же громкий насколько возможно на ошибке
или что-то как этот
Не пытайтесь закодировать слишком много значения в значение выхода: подробные состояния и сообщения об ошибке должны перейти к stdout / stderr, как Arkadiy предполагает.
Однако я нашел очень полезным представить просто горстку состояний в значениях выхода, с помощью двоичных единиц информации для кодирования их. Например, предположите, что у Вас есть следующие изобретенные значения:
0000 : 0 (no error)
0001 : 1 (error)
0010 : 2 (I/O error)
0100 : 4 (user input error)
1000 : 8 (permission error)
Затем ошибка ввода данных пользователем имела бы возвращаемое значение 5 (4 + 1), в то время как файл журнала, не имеющий разрешение записи, мог бы иметь возвращаемое значение 11 (8 + 2 + 1). Поскольку различные значения независимо кодируются в возвращаемом значении, можно легко видеть то, что произошло путем проверки, какие биты установлены.
Как особый случай, чтобы видеть, была ли ошибка, Вы можете И код возврата с 1.
Путем выполнения этого можно закодировать несколько разных вещей в коде возврата ясным и простым способом. Я использую это только для принятия простых решений тех, которые "должны процесс быть перезапущенными", "делают возвращаемое значение и соответствующие журналы должны быть отправлены администратору", такая вещь. Любая подробная диагностическая информация должна перейти к журналам или к stdout / stderr.
Нормальные статусы выхода работают от 0 до 255 (см. Коды выхода, больше, чем 255 возможных для обсуждения почему). Обычно, состояние 0 указывает на успех; что-либо еще - определенная реализацией ошибка. Я действительно знаю о программе, которая сообщает о состоянии сервера DBMS через статус выхода; это - особый случай определенных реализацией статусов выхода. Обратите внимание, что Вы добираетесь для определения реализации состояний программ.
Я не мог вместить это в 300 символов; иначе это был бы комментарий к ответу @Arkadiy.
Arkadiy прав, что в одной части слова статуса выхода, значения кроме нуля указывают на сигнал, который завершил процесс, и 8-й бит обычно указывает на дамп ядра, но тот раздел статуса выхода отличается от основного 0.. 255 состояний. Однако оболочке (какой бы ни оболочка это) дарят проблему, когда процесс умирает в результате сигнала. Существует 16 битов данных, которые будут представлены в 8-разрядном значении, которое всегда хитро. То, что оболочки, кажется, делают, должно взять число сигнала и добавить 128 к нему. Так, если процесс умирает в результате прерывания (сигнал номер 2, SIGINT), оболочка сообщает о статусе выхода как 130. Однако ядро сообщило о состоянии как 0x0002; оболочка изменила то, о чем сообщает ядро.
Следующий код C демонстрирует это. Существует две программы
suicide
который уничтожает себя с помощью сигнала выбора (прерывание по умолчанию).exitstatus
который выполняет команду (такой как suicide
) и сообщает о статусе выхода ядра.Вот suicide.c
:
/*
@(#)File: $RCSfile: suicide.c,v $
@(#)Version: $Revision: 1.2 $
@(#)Last changed: $Date: 2008/12/28 03:45:18 $
@(#)Purpose: Commit suicide using kill()
@(#)Author: J Leffler
@(#)Copyright: (C) JLSS 2008
@(#)Product: :PRODUCT:
*/
/*TABSTOP=4*/
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */
#include <signal.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "stderr.h"
static const char usestr[] = "[-V][-s signal]";
#ifndef lint
/* Prevent over-aggressive optimizers from eliminating ID string */
extern const char jlss_id_suicide_c[];
const char jlss_id_suicide_c[] = "@(#)$Id: suicide.c,v 1.2 2008/12/28 03:45:18 jleffler Exp $";
#endif /* lint */
int main(int argc, char **argv)
{
int signum = SIGINT;
int opt;
char *end;
err_setarg0(argv[0]);
while ((opt = getopt(argc, argv, "Vs:")) != -1)
{
switch (opt)
{
case 's':
signum = strtol(optarg, &end, 0);
if (*end != '\0' || signum <= 0)
err_error("invalid signal number %s\n", optarg);
break;
case 'V':
err_version("SUICIDE", &"@(#)$Revision: 1.2 $ ($Date: 2008/12/28 03:45:18 $)"[4]);
break;
default:
err_usage(usestr);
break;
}
}
if (optind != argc)
err_usage(usestr);
kill(getpid(), signum);
return(0);
}
И вот exitstatus.c
:
/*
@(#)File: $RCSfile: exitstatus.c,v $
@(#)Version: $Revision: 1.2 $
@(#)Last changed: $Date: 2008/12/28 03:45:18 $
@(#)Purpose: Run command and report 16-bit exit status
@(#)Author: J Leffler
@(#)Copyright: (C) JLSS 2008
@(#)Product: :PRODUCT:
*/
/*TABSTOP=4*/
#if __STDC_VERSION__ >= 199901L
#define _XOPEN_SOURCE 600
#else
#define _XOPEN_SOURCE 500
#endif /* __STDC_VERSION__ */
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/wait.h>
#include "stderr.h"
#ifndef lint
/* Prevent over-aggressive optimizers from eliminating ID string */
extern const char jlss_id_exitstatus_c[];
const char jlss_id_exitstatus_c[] = "@(#)$Id: exitstatus.c,v 1.2 2008/12/28 03:45:18 jleffler Exp $";
#endif /* lint */
int main(int argc, char **argv)
{
pid_t pid;
err_setarg0(argv[0]);
if (argc < 2)
err_usage("cmd [args...]");
if ((pid = fork()) < 0)
err_syserr("fork() failed: ");
else if (pid == 0)
{
/* Child */
execvp(argv[1], &argv[1]);
return(1);
}
else
{
pid_t corpse;
int status;
corpse = waitpid(pid, &status, 0);
if (corpse != pid)
err_syserr("waitpid() failed: ");
printf("0x%04X\n", status);
}
return(0);
}
Недостающий код, stderr.c
и stderr.h
, может легко быть найден в по существу любой из моих опубликованных программ. Если Вы нуждаетесь в нем срочно, получаете его из программы SQLCMD в Архиве IIUG Software; альтернативно, свяжитесь со мной по электронной почте (см. мой профиль).