未验证 提交 9f12b58c 编写于 作者: X Xuan Ronaldo 提交者: GitHub

[IOTDB-5028] Using `show timeseries` to query the schema in import-csv (#8130)

上级 444bfade
......@@ -21,6 +21,7 @@ package org.apache.iotdb.tool;
import org.apache.iotdb.commons.exception.IllegalPathException;
import org.apache.iotdb.commons.utils.PathUtils;
import org.apache.iotdb.db.mpp.common.header.ColumnHeaderConstant;
import org.apache.iotdb.db.qp.constant.SQLConstant;
import org.apache.iotdb.db.qp.utils.DateTimeUtils;
import org.apache.iotdb.exception.ArgsErrorException;
......@@ -30,6 +31,8 @@ import org.apache.iotdb.session.Session;
import org.apache.iotdb.session.SessionDataSet;
import org.apache.iotdb.tsfile.common.constant.TsFileConstant;
import org.apache.iotdb.tsfile.file.metadata.enums.TSDataType;
import org.apache.iotdb.tsfile.read.common.Field;
import org.apache.iotdb.tsfile.read.common.RowRecord;
import org.apache.commons.cli.CommandLine;
import org.apache.commons.cli.CommandLineParser;
......@@ -436,10 +439,9 @@ public class ImportCsv extends AbstractCsvTool {
parseHeaders(headerNames, deviceAndMeasurementNames, headerTypeMap, headerNameMap);
Set<String> devices = deviceAndMeasurementNames.keySet();
String devicesStr = StringUtils.join(devices, ",");
if (headerTypeMap.isEmpty()) {
try {
queryType(devicesStr, headerTypeMap, "Time");
queryType(devices, headerTypeMap, "Time");
} catch (IoTDBConnectionException e) {
e.printStackTrace();
}
......@@ -601,7 +603,15 @@ public class ImportCsv extends AbstractCsvTool {
if (!typeQueriedDevice.contains(deviceName.get())) {
try {
if (headerTypeMap.isEmpty()) {
hasResult = queryType(deviceName.get(), headerTypeMap, "Device");
hasResult =
queryType(
new HashSet<String>() {
{
add(deviceName.get());
}
},
headerTypeMap,
"Device");
}
typeQueriedDevice.add(deviceName.get());
} catch (IoTDBConnectionException e) {
......@@ -817,32 +827,37 @@ public class ImportCsv extends AbstractCsvTool {
* @throws StatementExecutionException
*/
private static boolean queryType(
String deviceNames, HashMap<String, TSDataType> headerTypeMap, String alignedType)
Set<String> deviceNames, HashMap<String, TSDataType> headerTypeMap, String alignedType)
throws IoTDBConnectionException {
String sql = "select * from " + deviceNames + " limit 1";
SessionDataSet sessionDataSet = null;
try {
sessionDataSet = session.executeQueryStatement(sql);
} catch (StatementExecutionException e) {
System.out.println("Meet error when query the type of timeseries because " + e.getMessage());
return false;
}
List<String> columnNames = sessionDataSet.getColumnNames();
List<String> columnTypes = sessionDataSet.getColumnTypes();
if (columnNames.size() == 1) {
return false;
} else {
for (int i = 1; i < columnNames.size(); i++) {
if (Objects.equals(alignedType, "Time")) {
headerTypeMap.put(columnNames.get(i), getType(columnTypes.get(i)));
} else if (Objects.equals(alignedType, "Device")) {
String[] split = columnNames.get(i).split("\\.");
String measurement = split[split.length - 1];
headerTypeMap.put(measurement, getType(columnTypes.get(i)));
boolean hasResult = false;
for (String deviceName : deviceNames) {
String sql = "show timeseries " + deviceName + ".*";
SessionDataSet sessionDataSet = null;
try {
sessionDataSet = session.executeQueryStatement(sql);
int tsIndex = sessionDataSet.getColumnNames().indexOf(ColumnHeaderConstant.TIMESERIES);
int dtIndex = sessionDataSet.getColumnNames().indexOf(ColumnHeaderConstant.DATATYPE);
while (sessionDataSet.hasNext()) {
hasResult = true;
RowRecord record = sessionDataSet.next();
List<Field> fields = record.getFields();
String timeseries = fields.get(tsIndex).getStringValue();
String dataType = fields.get(dtIndex).getStringValue();
if (Objects.equals(alignedType, "Time")) {
headerTypeMap.put(timeseries, getType(dataType));
} else if (Objects.equals(alignedType, "Device")) {
String[] split = PathUtils.splitPathToDetachedNodes(timeseries);
String measurement = split[split.length - 1];
headerTypeMap.put(measurement, getType(dataType));
}
}
} catch (StatementExecutionException | IllegalPathException e) {
System.out.println(
"Meet error when query the type of timeseries because " + e.getMessage());
return false;
}
return true;
}
return hasResult;
}
/**
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册