我正在尝试在AWS Glue中添加一个名为timestamp
的新列。
我的上游数据键有大写字母。
x1c 0d1x的数据
但是,在添加了timestamp
列之后,其余列的键变成了小写。
实验一:转换- SQL查询
select
cast((Absolute_Time - 2082844800) * 1000 as bigint) as timestamp,
*
from
engine_demo;
字符串
但是,它降低了我所有的键。
的
实验二:转换-自定义代码
def MyTransform (glueContext, dfc) -> DynamicFrameCollection:
df = dfc.select(list(dfc.keys())[0]).toDF()
from pyspark.sql import functions as F
df = df.withColumn(
"timestamp",
((F.col("Absolute_Time") - 2082844800) * 1000).cast("long")
)
dynamic_frame = DynamicFrame.fromDF(df, glueContext, "changed")
return (DynamicFrameCollection({"result_dynf": dynamic_frame}, glueContext))
型
它还降低了我所有的钥匙
的
实验三
我找到了Enable case sensitivity for spark.sql globally
但是,在“转换- SQL查询”节点中没有可以设置的地方,所以我尝试在“转换-自定义”代码中设置配置:
def MyTransform (glueContext, dfc) -> DynamicFrameCollection:
glueContext.spark_session.conf.set("spark.sql.caseSensitive", "true")
df = dfc.select(list(dfc.keys())[0]).toDF()
from pyspark.sql import functions as F
df = df.withColumn(
"timestamp",
((F.col("Absolute_Time") - 2082844800) * 1000).cast("long")
)
dynamic_frame = DynamicFrame.fromDF(df, glueContext, "changed")
return (DynamicFrameCollection({"dynamic_frame": dynamic_frame}, glueContext))
型
然而,上面的代码给出了相同的结果。
是否有方法在AWS Glue Transform节点中保留关键字母大小写?谢谢你,谢谢
2条答案
按热度按时间d4so4syb1#
我们可以在ETL作业脚本的ApplyMapping部分应用区分大小写的标志。请看answer。希望能帮上忙!
lp0sw83n2#
这是我的实验结果,如果我删除这个变换“转换时间”步骤,直接下沉到Delta Lake。它将保留字母盒。
然而,由于我使用Glue Crawler在Glue Catalog中注册Delta表。
以下是我从AWS团队的Jay Naves那里得到的一些信息(谢谢!):
Glue catalog强制小写列名与Hive兼容,因为Hive元存储区模式将所有列名小写。
https://github.com/apache/hive/blob/9d81764788920851c4461827a9984dbf48fdf6db/ql/src/java/org/apache/hadoop/hive/ql/metadata/SessionHiveMetaStoreClient.java#L909
所以即使是我也保留了Delta表中的情况。下游仍然会变成小写。
最后我用这个解决方案:
由于SQL查询默认设计为不区分大小写,
1.
字符串
将返回
Absolute_Time
。2.
型
将返回
absolute_time
3.
型
返回
absolute_time
。大多数时候,在 Jmeter 板中,用户可以使用第一种方式进行查询,以获得正确的字母大小写。
如果任何用户需要使用
select *
,我可以提供一个dict来帮助从小写Map到正确的字母大小写。