Hive 如何在Jython Evaluator中获取流集记录字段类型

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类型转换为字符串。它工作正常,直

我有一个StreamSets管道,在这里我使用JDBC组件从远程sqlserver数据库读取数据,并将数据放入一个配置单元和一个Kudu数据池

我在类型二进制列方面遇到了一些问题,因为Impala中并没有二进制类型支持,我使用它访问Hive和Kudu

我决定将二进制类型的列(作为Byte_数组类型在管道中流动)转换为String,并像那样插入它

我尝试使用字段类型转换器元素将所有字节数组类型转换为字符串,但没有成功。因此,我使用Jython组件将所有arr.arr类型转换为字符串。它工作正常,直到我在该字段上得到一个空值,所以Jython类型是None.type,我无法检测字节数组类型,也无法将其转换为字符串。所以我不能把它插入库杜


如何在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
    
其思想是将字段的值保存在一个临时变量中,将字段的值设置为无,并使用函数sdcFunctions.getFieldNull通过将其与一个NULL_常量进行比较来了解StreamSets类型

import binascii def toByteArrayToHexString(value): if value is None: return NULL_STRING value = '0x'+binascii.hexlify(value).upper() return value for record in records: try: for colName,value in record.value.items(): temp = record.value[colName] record.value[colName] = None if sdcFunctions.getFieldNull(record,'/'+colName) is NULL_BYTE_ARRAY: temp = toByteArrayToHexString(temp) record.value[colName] = temp output.write(record) except Exception as e error.write(record, str(e)) 导入binascii def toByteArrayToHexString(值): 如果值为“无”: 返回空字符串 值='0x'+binascii.hexlify(值).upper() 返回值 记录中的记录: 尝试: 对于colName,记录.value.items()中的值: temp=记录值[colName] record.value[colName]=无 如果sdcFunctions.getFieldNull(记录“/”+colName)为NULL\u字节\u数组: temp=toByteArrayToHexString(temp) 记录值[colName]=temp 输出.写入(记录) 例外情况除外 错误。写入(记录,str(e)) 限制:
上面的代码仅当日期类型具有值(当其不为空时)时才将其转换为日期时间类型。

感谢您花时间回答这个问题,奇怪的是您为什么不使用
(类型(v)=array.array和v.typecode==“b”)
test查看该值是否为字节数组?因为我想获得streamset中使用的确切类型,而不涉及Jython转换。我认为Jython类型是冗余信息,如果您已经拥有streamset类型。另外,我不确定streamset到Jython类型的转换是否是一对一的映射。你觉得怎么样?另一件事,在这行“record.value[colName]=None”之后,Jython类型将是None.type,我不想检查它。