args = getResolvedOptions(sys.argv, ['JOB_NAME','source_db','source_table','count','dest_folder'])
sc = SparkContext()
glueContext = GlueContext(sc)
spark = glueContext.spark_session
job = Job(glueContext)
job.init(args['JOB_NAME'], args)
df_new = glueContext.create_dynamic_frame.from_catalog(database = args['source_db'], table_name = args['source_table'], transformation_ctx = "sample_data")
df_0 = df_new.toDF()
df_0.registerTempTable("spark_dataframe")
new_data = spark.sql("Select * from spark_dataframe")
sample = new_data.limit(args['count'])
sample.repartition(1).write.format('csv').options(delimiter=',',header=True).save("s3://"+ args['dest_folder'] +"/")
job.commit()
I am getting error for line
sample = new_data.limit(args['count'])
error:
py4j.Py4JException: Method limit([class java.lang.String]) does not exist
but the argument passed is not a string.
Спасибо все для Вашей справки. Я взял многие Ваши идеи и соединил их, сообщил мне то, что Вы думаете.
я добавил два метода к классу как это:
def hours(self):
retval = ""
if self.totalTime:
hoursfloat = self.totalTime.seconds / 3600
retval = round(hoursfloat)
return retval
def minutes(self):
retval = ""
if self.totalTime:
minutesfloat = self.totalTime.seconds / 60
hoursAsMinutes = self.hours() * 60
retval = round(minutesfloat - hoursAsMinutes)
return retval
В моем django я использовал это (сумма является объектом, и это находится в словаре):
<td>{{ sum.0 }}</td>
<td>{{ sum.1.hours|stringformat:"d" }}:{{ sum.1.minutes|stringformat:"#02.0d" }}</td>
Можно просто преобразовать timedelta в строку с ул. (). Вот пример:
import datetime
start = datetime.datetime(2009,2,10,14,00)
end = datetime.datetime(2009,2,10,16,00)
delta = end-start
print(str(delta))
# prints 2:00:00
Пример следующего Joe оценивает выше, я использовал бы арифметический оператор модуля, таким образом:
td = datetime.timedelta(hours=10.56)
td_str = "%d:%d" % (td.seconds/3600, td.seconds%3600/60)
Примечание, которое целочисленное деление в Python округляет в меньшую сторону по умолчанию; если Вы хотите быть более явными, используйте math.floor () или math.ceil () как соответствующий.
>>> str(datetime.timedelta(hours=10.56))
10:33:36
>>> td = datetime.timedelta(hours=10.505) # any timedelta object
>>> ':'.join(str(td).split(':')[:2])
10:30
Передача эти timedelta
объект к эти str()
вызовы функции то же, форматирующее код используемый, если мы просто тип print td
. Так как Вы не хотите секунды, мы можем разделить строку двоеточиями (3 части) и отложить ее только вместе с первыми 2 частями.
Как Вы знаете, можно получить total_seconds от объекта timedelta путем доступа эти .seconds
атрибут.
Python обеспечивает встроенную функцию divmod()
, который допускает:
s = 13420
hours, remainder = divmod(s, 3600)
minutes, seconds = divmod(remainder, 60)
print '{:02}:{:02}:{:02}'.format(int(hours), int(minutes), int(seconds))
# result: 03:43:40
или можно преобразовать в часы и остаток при помощи комбинации модуля и вычитания:
# arbitrary number of seconds
s = 13420
# hours
hours = s // 3600
# remaining seconds
s = s - (hours * 3600)
# minutes
minutes = s // 60
# remaining seconds
seconds = s - (minutes * 60)
# total time
print '{:02}:{:02}:{:02}'.format(int(hours), int(minutes), int(seconds))
# result: 03:43:40
Прямой шаблон фильтрует для этой проблемы. Интервал встроенной функции () никогда не окружает. Струны фа (т.е. f'') требуют python 3.6.
@app_template_filter()
def diffTime(end, start):
diff = (end - start).total_seconds()
d = int(diff / 86400)
h = int((diff - (d * 86400)) / 3600)
m = int((diff - (d * 86400 + h * 3600)) / 60)
s = int((diff - (d * 86400 + h * 3600 + m *60)))
if d > 0:
fdiff = f'{d}d {h}h {m}m {s}s'
elif h > 0:
fdiff = f'{h}h {m}m {s}s'
elif m > 0:
fdiff = f'{m}m {s}s'
else:
fdiff = f'{s}s'
return fdiff
My datetime.timedelta
objects went greater than a day. So here is a further problem. All the discussion above assumes less than a day. A timedelta
is actually a tuple of days, seconds and microseconds. The above discussion should use td.seconds
as joe did, but if you have days it is NOT included in the seconds value.
I am getting a span of time between 2 datetimes and printing days and hours.
span = currentdt - previousdt
print '%d,%d\n' % (span.days,span.seconds/3600)