如何在粘贴作业中添加当前时间戳(额外列),以便输出数据具有额外列。在这种情况下:
架构源表: Col1,Col2
胶水作业后。
目的地架构: Col1,Col2,Update_Date(当前时间戳)
答案 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
部分