hive宏/udf-parallel/combined/single解释器

q3aa0525  于 2021-06-26  发布在  Hive
关注(0)|答案(1)|浏览(323)

我想创建一个可以
a) 创建/修改数据库表和
b) 过程数据。
这里的问题是,对于b)需要并行处理作为udf的常规做法,而对于a)则必须防止并行处理,例如,因为我不能多次将同一列添加到表中。在外部接口上,解决方案应与sas、sap、r、pentaho的配置单元连接器保持兼容,即,它的行为和可用性应与配置单元相同。
您建议如何实现dbcreate/modify语句的执行,而不会因为并行执行udf而遇到重复hql命令的错误?
我的想法:
1.使用jdbc Package 器来处理a)如本文所述和b)的UDF问题:需要额外编程,(客户端/服务器端)安装和配置:http://stackoverflow.com/questions/8293314/is-there-any-lightweight-jdbc-wrapper-with-these-features, https://www.redfin.com/blog/2011/03/boilerplate_jdbc_wrapper.html, http://www.javaworld.com/article/2074249/data-storage/create-your-own-type-3-jdbc-driver--part-1.html, http://jdbc.jcabi.com/
2.带有udfs+连接到配置单元解析器的配置单元。在钩子中,hql只执行一次:问题:非常复杂,需要更改配置单元设置(可能不可接受):http://stackoverflow.com/questions/17461932/hive-execution-hook
3.包含宏的配置单元。问题:似乎不完全成熟,限制(主要是数字?)和记录不良。
4.带有udfs+显式组合器restful服务+jdbc/beeline/hcatalog作为配置单元命令api的配置单元。问题:单点故障。
5.基于udfs+hive组合器的hive实现。问题:不可能或非常复杂:http://stackoverflow.com/questions/10925840/partial-aggregation-vs-combiners-which-one-faster
6.使用一种聚合/组合方法,如本文结尾对udafs所述:问题:没有很好的文档记录,可能不可行:http://www.dataiku.com/blog/2013/05/01/a-complete-guide-to-writing-hive-udf.html
7.从genericudafevaluator派生并实现merge,以便在单独的表中只创建一次所需的sql语句。其他一些机制(如配置单元宏)可以执行此表中累积的命令。问题:复杂的实现和配置单元宏的问题。
8.使用/扩展配置单元网关实现,如knox网关服务配置单元:http://repo1.maven.org/maven2/org/apache/knox/gateway-service-hive/0.8.0/ 问题:太诺克斯具体。在大多数情况下,通用jdbc Package 器是更好的基础。
不够:
9将“if not exists”添加到支持此操作的hql语句的语句中。还有其他机制,如http://stackoverflow.com/questions/14381895/mysql-add-column-if-not-exist, http://stackoverflow.com/questions/972922/add-column-to-mysql-table-if-it-does-not-exist
10这个https://github.com/jwills/exhibit github上的自定义项并不足够,但很有趣。
11getexistinghiveconnection()混淆了配置单元解析器;getnewhiveconnection()也不能解决hql结构命令不需要的并行执行导致错误的问题。
我注意到在一个udf中创建另一个到hive的连接会导致hive解析器的混乱,这是可以理解的。然而,在一个复杂的udf中,我也注意到在这个上下文中,第二个.tostring()不再工作了,为什么 public Object evaluate(GenericUDF.DeferredObject[] paramArrayOfDeferredObject) { … for (int i = 0; i < paramLen; i++) { paramObj = paramArrayOfDeferredObject[i].get(); paramObjectArr[i] = this.objConverters[0].convert(paramObj); tableName = paramObjectArr[i].toString(); // works …} 稍后: String tableName = paramObjectArr[0].toString(); // does NOT work, empty string is assigned, why?

mo49yndu

mo49yndu1#

@thomas_poetter-您在这里提供了很多考虑因素,但我并不完全清楚您的实际用例是什么。例如,为什么不将1和2完全分开,直接对hs2执行结构化任务,并将处理放在自定义项中?
oozie还可以提供一些有趣的工作流功能来保持这个独立但作为单个工作流执行。
注意,knox只是jdbc/odbc调用hs2的流网关。为这类事情扩展它是没有意义的。但是,您可以提供一个简单的定制服务来公开knox可以代理的api。如果您需要独立于某些外部应用程序执行任务,那么这可能很有用。

相关问题