从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')中显示正确的日期值
对此案有何建议?
答案 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>