当我使用show create table mydb.mytable
显示的命令在spark中重新创建表时,我无法使用Hive中的表。这只是发生在一些表上,我重新创建的其他表仍然可以从hive访问。
我正在添加注释元数据到我的spark表。我通过重新创建一个加载的表来实现。我首先使用spark命令创建一个表:
spark.sql('show create table mydb.mytable')
它将返回如下创建表命令:
"CREATE TABLE `raw_db`.`mytable` (`municipio` STRING )
USING orc
OPTIONS (`serialization.format` '1',
'hdfs://xxxx/corporativo/raw_db/mytable')"
我解析返回的SQL并在其中插入注释,但是当我重新创建它时,spark仍然可以正确地看到表,但它在Hive中失败。以下是我运行describe raw_db.mytable
命令时Hive显示的内容:
col_name data_type comment
col array<string> from deserializer
下面是重建失败的表的完整模式:
CREATE TABLE `sbx_ppppp`.`mytable` (
`id_conct_cdstrl` DECIMAL(19,0),
`dt_cria` TIMESTAMP,
`id_usu_cria` STRING,
`dt_ult_atualz` TIMESTAMP,
`id_usu_ult_atualz` STRING,
`nu_vrs` DECIMAL(19,0),
`dt_ini_vignc` TIMESTAMP,
`dt_fim_vignc` TIMESTAMP,
`nu_dia_prz_vignc` DECIMAL(4,0),
`in_escp_cnslt_altrd` STRING,
`id_fnt_conct_cdstrl` DECIMAL(2,0),
`id_avalc_conct_cdstrl_dlibr` DECIMAL(2,0),
`id_avalc_conct_cdstrl_autmtc` DECIMAL(2,0),
`id_avalc_conct_cdstrl_prop` DECIMAL(2,0),
`nu_rlat` DECIMAL(19,0),
`id_sit_conct_cdstrl` DECIMAL(2,0),
`id_solic_anls_conct_cdstrl` DECIMAL(19,0),
`id_anlst_rspvl` DECIMAL(19,0),
`id_grnt_rspvl` DECIMAL(19,0),
`id_doc_lst` DECIMAL(19,0),
`id_dlibr` DECIMAL(19,0),
`id_pondrc_escp` DECIMAL(2,0),
`qt_entdd_nao_escp` DECIMAL(6,0),
`vl_pontc_calc_nao_escp` DECIMAL(9,0),
`ds_fnaldd` STRING,
`te_pre_anls_conct_cdstrl` STRING)
USING orc
OPTIONS (
`serialization.format` '1',
path 'hdfs://xxxx/corporativo/raw_db/mytable'
)
我没有注意到它工作的表和我在重新创建后无法从Hive中看到模式的表有任何区别。
如何解决这几个表的这个问题?
问题是有些表的注释太大。在Spark中,任何有超过1000字节注释的列的表都可以工作,但是当从Hive中访问时,模式就会被破坏。
我截断了1000字节以上的注释,一切都很好。
注意这个限制是相对于字符串中的字节数的。因此,如果您在注释中使用UTF-8编码的字符串,则任何重音字符将使用至少2个字节。
这个限制不适用于表注释,只适用于列。
我仍然不知道注释的大小是在哪里配置的。在我的开发环境中一切正常,但在生产环境中失败了。
顺便说一下,在我的Spark版本中,show create table
命令不显示注释。