Hive 如何在Jython Evaluator中获取流集记录字段类型
我有一个StreamSets管道,在这里我使用JDBC组件从远程sqlserver数据库读取数据,并将数据放入一个配置单元和一个Kudu数据池 我在类型二进制列方面遇到了一些问题,因为Impala中并没有二进制类型支持,我使用它访问Hive和Kudu 我决定将二进制类型的列(作为Byte_数组类型在管道中流动)转换为String,并像那样插入它 我尝试使用字段类型转换器元素将所有字节数组类型转换为字符串,但没有成功。因此,我使用Jython组件将所有arr.arr类型转换为字符串。它工作正常,直到我在该字段上得到一个空值,所以Jython类型是None.type,我无法检测字节数组类型,也无法将其转换为字符串。所以我不能把它插入库杜Hive 如何在Jython Evaluator中获取流集记录字段类型,hive,bigdata,jython,kudu,streamsets,Hive,Bigdata,Jython,Kudu,Streamsets,我有一个StreamSets管道,在这里我使用JDBC组件从远程sqlserver数据库读取数据,并将数据放入一个配置单元和一个Kudu数据池 我在类型二进制列方面遇到了一些问题,因为Impala中并没有二进制类型支持,我使用它访问Hive和Kudu 我决定将二进制类型的列(作为Byte_数组类型在管道中流动)转换为String,并像那样插入它 我尝试使用字段类型转换器元素将所有字节数组类型转换为字符串,但没有成功。因此,我使用Jython组件将所有arr.arr类型转换为字符串。它工作正常,直
如何在Jython Evaluator中获取StreamSet记录字段类型,有什么帮助吗?或者针对我面临的问题建议解决方法?您需要使用
sdcFunctions.getFieldNull()
来测试字段是否为NULL\u BYTE\u ARRAY
。例如:
import array
def convert(item):
return ':-)'
def is_byte_array(record, k, v):
# getFieldNull expect a field path, so we need to prepend the '/'
return (sdcFunctions.getFieldNull(record, '/'+k) == NULL_BYTE_ARRAY
or (type(v) == array.array and v.typecode == 'b'))
for record in records:
try:
record.value = {k: convert(v) if is_byte_array(record, k, v) else v
for k, v in record.value.items()}
output.write(record)
except Exception as e:
error.write(record, str(e))
这是我的最终解决方案:
- 您可以使用下面的逻辑,通过使用NULL_常量来检测Jython组件内的任何流集类型:
NULL_BOOLEAN, NULL_CHAR, NULL_BYTE, NULL_SHORT, NULL_INTEGER, NULL_LONG, NULL_FLOAT, NULL_DOUBLE, NULL_DATE, NULL_DATETIME, NULL_TIME, NULL_DECIMAL, NULL_BYTE_ARRAY, NULL_STRING, NULL_LIST, NULL_MAP
上面的代码仅当日期类型具有值(当其不为空时)时才将其转换为日期时间类型。感谢您花时间回答这个问题,奇怪的是您为什么不使用
(类型(v)=array.array和v.typecode==“b”)
test查看该值是否为字节数组?因为我想获得streamset中使用的确切类型,而不涉及Jython转换。我认为Jython类型是冗余信息,如果您已经拥有streamset类型。另外,我不确定streamset到Jython类型的转换是否是一对一的映射。你觉得怎么样?另一件事,在这行“record.value[colName]=None”之后,Jython类型将是None.type,我不想检查它。