在Apache Phoenix

时间:2018-12-17 07:54:37

标签: java date timestamp hbase phoenix

从Apache phoenix读取通过hbase api(使用'put'命令)创建的日期格式数据时遇到问题。

这是我期望的日期格式: 日期:2018-12-17T21:21:45 + 07:00进入 'yyyy-MM-dd'=>'2018-12-17'

该表是使用以下DDL从phoenix客户端创建的:

CREATE TABLE "TEST"
(
 ID VARCHAR,
 "col1".TRX_DATES UNSIGNED_DATE 
 CONSTRAINT PKD PRIMARY KEY (ID)
)

但是,当我尝试查询数据时,它显示了错误的日期格式:

  

292269006-11-18

我尝试了一些使用各种数据类型将日期插入到hbase中的研究和实验,包括使用日期的长值(毫秒)。但仍然无法在凤凰号('yyyy-MM-dd')中显示正确的日期值

对此案有何建议?

1 个答案:

答案 0 :(得分:0)

也许这应该是一条评论,因为我无法解释出现问题的所有详细信息,也无法解决该问题。但是我可以看到,您的问题出自历元以来毫秒的符号位反转。我尝试过:

def file_len(fname):
    with open(fname) as f:
        for i, l in enumerate(f):
            pass
    return i + 1

len_of_file = file_len('test.csv')

df1 = pd.read_csv('test.csv', 
                  usecols=['tpep_pickup_datetime'], 
                  parse_dates=['tpep_pickup_datetime'])

sorted_idx = (df1['tpep_pickup_datetime'].sort_values()
                 .iloc[np.arange(0,len_of_file,500)].index)

skipped = np.setdiff1d(np.arange(len_of_file), sorted_idx)
print (skipped)

df = pd.read_csv('test.csv', skiprows=skipped).sort_values(by=['tpep_pickup_datetime'])

我的计算机上的输出(在欧洲/哥本哈根时区)为:

    long milli = OffsetDateTime.parse("2018-12-17T21:21:45+07:00").toInstant().toEpochMilli();
    milli += Long.MIN_VALUE; // Flip the sign bit
    Date wrongDateAsOldfashiondDate = new Date(milli);
    System.out.println(wrongDateAsOldfashiondDate);
    System.out.println(new SimpleDateFormat("yyyy-MM-dd").format(wrongDateAsOldfashiondDate));

通常不应该使用设计不佳的老式Fri Nov 18 08:08:49 CET 292269006 292269006-11-18 类,但这是我可以获得与您的结果完全相同的结果的方法。与现代的日期和时间API的区别在于Date使用儒略历,因此很显然,软件也使用了它,从而产生了您意想不到的结果(可能也涉及了Date类)。 / p>