如何将 nvarchar 从 T-SQL 方言转换为 hiveQL?

Posted

技术标签:

【中文标题】如何将 nvarchar 从 T-SQL 方言转换为 hiveQL?【英文标题】:how to convert nvarchar from T-SQL dialect to hiveQL? 【发布时间】:2020-10-05 11:55:40 【问题描述】:

我正在执行将查询从一种 SQL 方言转换为另一种的 ETL 任务。旧的 db 使用 T-Sql,新的是 hiveQL。

SELECT CAST(CONCAT(FMH.FLUIDMODELID,'_',RESERVOIR,'_',PRESSUREPSIA) AS NVARCHAR(255)) AS FACT_RRFP_INJ_PRESS_R_PHK
, FMH.FluidModelID ,FMH.FluidModelName ,[AnalysisDate] 

    FROM dbo.LZ_RRFP_FluidModelInj fmi 
    LEFT JOIN DBO.LZ_RRFP_FluidModelHeader fmh ON fmi.FluidModelIDFK = fmh.FluidModelID
    LEFT JOIN LZ_RRFP_FluidModelAss fma on fma.InjectionFluidModelIDFK = fmi.FluidModelIDFK
WHERE FMA.RESERVOIR  IN (SELECT RESERVOIR_CD FROM ATT_RESERVOIR)

错误是:

org.apache.spark.sql.catalyst.parser.ParseException: 
DataType nvarchar(255) is not supported.

如何转换nvarchar?

【问题讨论】:

你为什么使用 CAST?如果这个 SELECT 语句是独立的,那么它什么也做不了;如果它是更大语句的一部分,例如 INSERT... SELECT 那么,如果需要 CAST,则强制转换为目标列类型,即 STRING 【参考方案1】:

Hive 在 STRING 和 VARCHAR 中使用 UTF-8,您可以使用 VARCHARSTRING 而不是 NVARCHAR

VARCHAR 在 Hive 中与 STRING + 长度验证相同。正如评论中提到的@NickW,您完全可以不使用CAST 来执行相同的操作,如果您使用VARCHAR(255) 将结果插入到表中,那么它在不使用CAST 的情况下也可以正常工作。

【讨论】:

以上是关于如何将 nvarchar 从 T-SQL 方言转换为 hiveQL?的主要内容,如果未能解决你的问题,请参考以下文章

在 t-sql 中转换 nvarchar 变量的排序规则

将 nvarchar 转换为日期时间/日期后的计算

将 T-SQL 转换为 MySQL

特定列 -- 将数据类型 nvarchar 转换为 bigint 时出错

T-SQL - 将日期时间转换为未分隔的 ISO 值

JPA Hibernate - 多种数据库方言和 nvarchar(length) 数据类型