我尝试通过JDBC驱动程序从Google BigQuery查询数据,但是某些值似乎不正确。
步骤:
将驱动程序加载到Java应用程序
通过jdbc连接Google查询 示例代码如下:
public static void main(String[] args) {
Connection conn = null;
String url ="jdbc:bigquery://https://www.googleapis.com/bigquery/v2:443;" +
"ProjectId=fedjdbc;OAuthType=0;DefaultDataset=jdbc;" +
"OAuthServiceAcctEmail=safed-913@fedjdbc.iam.gserviceaccount.com;" +
"OAuthPvtKeyPath=/Users/laptop/workspace/bigquery/accounts/fedjdbc-5cb29b8a02fb.json";
try {
Class.forName("com.simba.googlebigquery.jdbc42.Driver");
conn = DriverManager.getConnection(url);
query(conn);
conn.close();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
public static void query(Connection conn) {
String sql = "select * from numbers1";
sql = "select * from numbers1";
sql = "select timestamp(\"0001-01-01 00:00:00 UTC\") from jdbc.test_date";
try {
PreparedStatement stmt = conn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);
System.out.println("query begin");
java.util.Date date = new java.util.Date();
System.out.println(System.currentTimeMillis());
ResultSet rs = stmt.executeQuery();
System.out.println(System.currentTimeMillis());
System.out.println("query end");
while (rs.next()) {
System.out.println(rs.getString(1));
//System.out.println(rs.getTimestamp(1));
}
rs.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}
您会发现结果不是“ 0001-01-01 00:00:00.000000”,而是“ 0001-01-03 08:00:00.000000”。
你知道为什么吗?
时区在本地转换数据?
我在具有不同时区,相同问题的某些主机中对其进行了测试。
答案 0 :(得分:0)
在代码实现中需要考虑一些事项。正如@MarkRotteveel所提到的,由于发生了多个历史性更改,因此使用0001-01-01进行测试将导致混乱。
BigQuery和大多数最常用的软件系统都可以与tz database配合使用,this thread旨在记录历史时区,并且您会发现与UTC有时会有所不同。作为测试,您可以尝试在BigQuery中查询时间戳“ 0001-01-01 America / Los Angeles”,并且会得到奇怪的结果“ 0001-01-01 07:52:58 UTC”。 this thread中有进一步的解释。
关于代码的实现,您还应考虑查看docs以便正确提取时间戳,因为在ResultSet上使用getString方法的方式似乎可能导致错误。