in odps/tableschema/table_schema.go [603:684]
func (schema *TableSchema) ToExternalSQLString(
projectName string,
schemaName string,
createIfNotExists bool,
serdeProperties map[string]string,
jars []string,
) (string, error) {
if schema.StorageHandler == "" {
return "", errors.New("TableSchema.StorageHandler is not set")
}
if schema.Location == "" {
return "", errors.New("TableSchema.Location is not set")
}
baseSQL, err := schema.ToBaseSQLString(projectName, schemaName, createIfNotExists, true)
if err != nil {
return "", errors.WithStack(err)
}
var builder strings.Builder
builder.WriteString(baseSQL)
// stored by, 用于指定自定义格式StorageHandler的类名或其他外部表文件格式
builder.WriteString(fmt.Sprintf("\nstored by '%s'\n", schema.StorageHandler))
// serde properties, 序列化属性参数
if len(serdeProperties) > 0 {
builder.WriteString("with serdeproperties(")
i, n := 0, len(serdeProperties)
for key, value := range serdeProperties {
builder.WriteString(fmt.Sprintf("%s=%s", common.QuoteString(key), common.QuoteString(value)))
i += 1
if i < n {
builder.WriteString(", ")
}
}
builder.WriteString(")\n")
}
// location, 外部表存放地址
builder.WriteString(fmt.Sprintf("location '%s'\n", schema.Location))
// 自定义格式时类定义所在的jar
if len(jars) > 0 {
builder.WriteString("using '")
n := len(jars)
for i, jar := range jars {
builder.WriteString(jar)
if i < n-1 {
builder.WriteString(", ")
}
}
builder.WriteString("'\n")
}
if len(schema.TblProperties) > 0 {
builder.WriteString("TBLPROPERTIES (")
i := 0
sortColsNum := len(schema.TblProperties)
for k, v := range schema.TblProperties {
builder.WriteString(fmt.Sprintf("%s=%s", common.QuoteString(k), common.QuoteString(v)))
i++
if i < sortColsNum {
builder.WriteString(", ")
}
}
builder.WriteString(")\n")
}
if schema.Lifecycle > 0 {
builder.WriteString(fmt.Sprintf("lifecycle %d", schema.Lifecycle))
}
builder.WriteRune(';')
return builder.String(), nil
}