Cassandra选择带有时区问题的查询

时间:2015-12-10 07:32:13

标签: cassandra cassandra-2.0 cqlsh spark-cassandra-connector cassandra-2.1

我们在两个不同的时区有两个不同的cassandra集群。

  • Cluster1:2.1.8版本,IST TZ
  • Cluster2:2.1.9版本,UTC TZ

对于带有timestamp列的select查询的cluster1,我不需要提及tz [+0530]值,而在另一个集群上,我必须并且应该在select查询中提供TZ值来获取行。是否与cassandra版本有关?

我使用cqlsh来执行查询部分。我试过cqlshrc文件选项,它只改变输出的格式。

cluster1中:

DECLARE @DociD INT,
     @XML NVARCHAR(MAX) = 
 '<root><App action="A" id="1">
 <BaseVehicle id="95989"/>
 <EngineBase id="2572"/>
 <Qty>2</Qty>
 <Note>Power</Note>
    <Note>Textured Finish</Note>
    <Note>w/Heat</Note>
    <Note>wo/Turn Signal</Note>
    <Note>w/Puddle Lamps</Note>
    <Note>wo/Dimming</Note>
     <PartType id="11618"/>
 <MfrLabel>Professional Grade</MfrLabel>
 <Position id="23"/>
 <Part>816-8130</Part>
 </App>
 <App action="A" id="2">
 <BaseVehicle id="8198"/>
 <Qty>2</Qty>
 <PartType id="11618"/>
 <MfrLabel>Professional Grade</MfrLabel>
 <Position id="23"/>
 <Part>816-8130</Part>
 </App>
 <App action="A" id="3">
 <BaseVehicle id="8197"/>
 <Qty>2</Qty>
 <PartType id="11618"/>
 <MfrLabel>Professional Grade</MfrLabel>
 <Position id="23"/>
 <Part>816-8130</Part>
 </App>
 <App action="A" id="11840">
    <BaseVehicle id="3723" />
    <Note>Power</Note>
    <Note>Textured Finish</Note>
    <Note>w/Heat</Note>
    <Note>wo/Turn Signal</Note>
    <Note>w/Puddle Lamps</Note>
    <Note>wo/Dimming</Note>
    <Qty>1</Qty>
    <PartType id="13117" />
    <Position id="2" />
    <Part>955-1147</Part>
  </App>
 </root>';

 EXEC sys.sp_xml_preparedocument
     @DociD OUTPUT,
     @XML;

 SELECT  *
 FROM    OPENXML(@DociD,'/root/App',3)
 WITH 
 (appaction CHAR(1) '@action',id INT '@id',
  BaseVehicleID INT './BaseVehicle/@id',
  Note varchar(20) './Note/@id'
  );

Cluster2中:

DECLARE @TABLE TABLE
    (
[App action] VARCHAR (50),
[APPID] VARCHAR (50),
[BaseVehicleid] VARCHAR (50),
[Qual] VARCHAR (50),
[Qty] VARCHAR (50),
[PartTypeID] VARCHAR (50),
MfrLabel VARCHAR (50),
PositionID VARCHAR (50),
Part VARCHAR (50),
[param value] VARCHAR (50),
SubModelID   VARCHAR (50),
EngineBaseID VARCHAR (50),   
EngineVINID VARCHAR (50),   
RecordCount VARCHAR (50),
Note VARCHAR (50)
)

如果没有提到TZ,我会得到“0”行。 我不想在cluster2中给TZ,请考虑如何做到这一点。

1 个答案:

答案 0 :(得分:2)

我必须承认,这有点奇怪,但2.1.8和2.1.9之间的时区操作可能会有一些变化。这来自更改日志:

  

(cqlsh)在Windows上修复1970年以前的时间戳,始终使用UTC   时间戳显示(CASSANDRA-10000)

另一方面,文档在这个问题上非常明确:

  

如果未指定时区,则为Cassandra的时区   使用处理写请求的协调器节点。为了准确,   DataStax建议指定时区而不是依赖   在Cassandra节点上配置的时区。

所以,我真诚的建议是指定时区,并指定相同的,可能是GMT(或UTC时间)。省去头痛。 Mind, GMT is not exactly equal to UTC, there is a slight difference in meaning。这样,您应该忽略群集上的时区设置。时间戳最终存储为毫秒(从某一点)。时区信息纯粹是一种“渲染”的东西。传递的毫秒数相同,例如2015/03/05 14:00:00+01002015/03/05 16:00:00+0300

如果您没有指定任何内容并获得0结果,而在使用+0000时获得结果,请确保您最初期望的数据是使用预期时区编写的。也许实际上跨度中没有任何数据,或者协调节点时间戳不同。