pyspark 如何在AWS Glue Transform节点中保留关键字母大小写?

m4pnthwp  于 2023-08-02  发布在  Spark
关注(0)|答案(2)|浏览(133)

我正在尝试在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节点中保留关键字母大小写?谢谢你,谢谢

d4so4syb

d4so4syb1#

我们可以在ETL作业脚本的ApplyMapping部分应用区分大小写的标志。请看answer。希望能帮上忙!

lp0sw83n

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.

select Absolute_Time from engine_demo;

字符串
将返回Absolute_Time
2.

select absolute_time from engine_demo;


将返回absolute_time
3.

select * from engine_demo;


返回absolute_time
大多数时候,在 Jmeter 板中,用户可以使用第一种方式进行查询,以获得正确的字母大小写。
如果任何用户需要使用select *,我可以提供一个dict来帮助从小写Map到正确的字母大小写。

相关问题