如何在粘贴作业中添加当前时间戳(额外列),以便输出数据具有额外列

时间:2018-01-22 18:46:45

标签: amazon-web-services pyspark etl aws-glue

如何在粘贴作业中添加当前时间戳(额外列),以便输出数据具有额外列。在这种情况下:

架构源表: Col1,Col2

胶水作业后。

目的地架构: Col1,Col2,Update_Date(当前时间戳)

6 个答案:

答案 0 :(得分:3)

我不确定使用DynamicFrame是否采用胶水原生方式,但您可以轻松转换为Spark Dataframe,然后使用withColumn方法。您需要使用lit函数将文字值放入新列中,如下所示。

from pyspark.sql.functions import lit

glue_df = glueContext.create_dynamic_frame.from_catalog(...)
spark_df = glue_df.toDF()
spark_df = spark_df.withColumn('some_date', lit(datetime.now()))

一些参考文献:

答案 1 :(得分:1)

根据我使用Glue的经验,Glue运行的时区是GMT。但我的时区是CDT。因此,要获得CDT时区,我需要在SparkContext中转换时间。这种特殊情况是将last_load_date添加到目标/接收器。

所以我创建了一个函数。

def convert_timezone(sc):
sqlContext = SQLContext(sc)
local_time=dt.now().strftime('%Y-%m-%d %H:%M:%S')
local_time_df=sqlContext.createDataFrame([(local_time,)],['time'])
CDT_time_df = local_time_df.select(from_utc_timestamp(local_time_df['time'],'CST6CDT').alias('cdt_time'))
CDT_time=[i['cdt_time'].strftime('%Y-%m-%d %H:%M:%S') for i in CDT_time_df.collect()][0]
return CDT_time

然后调用函数,如...

job_run_time =  date_config.convert_timezone(sc)

datasourceDF0 = datasource0.toDF()
datasourceDF1 = datasourceDF0.withColumn('last_updated_date',lit(job_run_time))

答案 2 :(得分:1)

使用Spark的current_timestamp()功能:

import org.apache.spark.sql.functions._

...

val timestampedDf = source.toDF().withColumn("Update_Date", current_timestamp())
val timestamped = DynamicFrame(timestampedDf, glueContext)

答案 3 :(得分:0)

如我所见,对此问题没有正确的答案,我将尝试解释我对这个问题的解决方案:

首先要弄清楚withColumn函数是执行此操作的好方法,但重要的是要提到此函数来自Spark本身的Dataframe,并且此函数不属于粘合DynamicFrame是Glue AWS的一个自有库,因此您需要隐蔽框架才能执行此操作。...

第一步是从DynamicFrame获得Spark Dataframe,胶水库使用toDF()函数来完成此操作,一旦有了Spark框架,您就可以添加列和/或执行任何操作您需要。

然后我们希望粘合的是他自己的框架,因此我们需要从spark转换回粘合专有框架,为此,您可以使用DynamicFrame的apply函数,该函数需要导入对象:

import com.amazonaws.services.glue.DynamicFrame

并使用您应该已经拥有的胶水上下文,例如:

DynamicFrame(sparkDataFrame, glueContext)

在简历中,代码应类似于:

import org.apache.spark.sql.functions._
import com.amazonaws.services.glue.DynamicFrame

...

val sparkDataFrame = datasourceToModify.toDF().withColumn("created_date", current_date())
val finalDataFrameForGlue = DynamicFrame(sparkDataFrame, glueContext)

...

注意:import org.apache.spark.sql.functions._将带来current_date()函数以添加带有日期的列。

希望这会有所帮助。...

答案 4 :(得分:0)

我们执行以下操作,并且无需转换为DF()就可以很好地工作

datasource0 = glueContext.create_dynamic_frame.from_catalog(...)

from datetime import datetime
def AddProcessedTime(r):
    r["jobProcessedDateTime"] = datetime.today() #timestamp of when we ran this.
    return r

mapped_dyF = Map.apply(frame = datasource0, f = AddProcessedTime)

答案 5 :(得分:0)

您现在可以使用内置功能执行此操作:请参阅 here...

注意只查找 glueContext.add_ingestion_time_columns 部分