我必须使用正则表达式过滤器按日期在Google Cloud BigTable中解析一系列行键,其中rowkey中的每个日期都根据Unix Epoch存储为反向时间戳(1月1日00:00:00) ,1970)。
例如,给定Date d = "2018-03-09T10:48:00.000Z"
,自Unix时代以来MS中的这个日期是d.valueOf() = 1520592480000
。在JavaScript中,允许的最大整数为Number.MAX_SAFE_INTEGER = 9007199254740991
,因此我们通过区分来计算 d 的反向日期 r :var r = Number.MAX_SAFE_INTEGER - d
其中{ {1}}。
给定两个反向日期 r1 和 r2 ,如何在RE2中编写正则表达式以获取此范围内的所有日期字符串?我正在尝试使用NodeJS(有限文档)在BigTable中使用反向时间戳行键查找范围内的所有日期,所以如果有任何比这更容易的解决方案,你知道我也会接受这些!
由于
答案 0 :(得分:1)
Javascript最大整数的变通办法是使查找不自然和高效。
我建议以Java和Bigtable都易于理解的方式表示行,同时保持自然顺序和过滤属性。
如果需要反转以防止出现热点,则可以尝试仅反转部分时间戳(10秒?)或在键中加盐(可以在https://cloud.google.com/bigtable/docs/schema-design-time-series的“ Salting”部分中进行检查)。
答案 1 :(得分:0)
没有一种使用纯正则表达式来处理整数范围的好方法,只能使用字符范围: https://stackoverflow.com/a/7861720/643848 https://github.com/google/re2/wiki/Syntax
此外,如果您可以表达查询以利用字典行键来进行过滤/扫描,那么Bigtable将更加高效,例如,如果您可以设置模式以使用更简单的查询来表达想要的范围,就像RowRange(https://cloud.google.com/bigtable/docs/reference/data/rpc/google.bigtable.v2#rowrange)一样。
您可能还想考虑只发出更广泛的查询,然后进行更多处理和过滤客户端。