class Egis::TableDDLGenerator
@!visibility private
Public Instance Methods
create_table_sql(table, permissive: false)
click to toggle source
# File lib/egis/table_ddl_generator.rb, line 6 def create_table_sql(table, permissive: false) <<~SQL CREATE EXTERNAL TABLE #{permissive_statement(permissive)}#{table.name} ( #{column_definition_sql(table.schema.columns)} ) #{partition_statement(table.schema)} #{row_format_statement(table.format)} LOCATION '#{table.location}'; SQL end
Private Instance Methods
column_definition_sql(columns)
click to toggle source
# File lib/egis/table_ddl_generator.rb, line 33 def column_definition_sql(columns) columns.map { |column| "`#{column.name}` #{column.type}" }.join(",\n") end
delimited_row_format_statement(format)
click to toggle source
# File lib/egis/table_ddl_generator.rb, line 60 def delimited_row_format_statement(format) case format when :csv "ROW FORMAT DELIMITED FIELDS TERMINATED BY ','" when :tsv "ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'" when :orc 'STORED AS ORC' else raise Errors::UnsupportedTableFormat, format.to_s end end
partition_statement(table_schema)
click to toggle source
# File lib/egis/table_ddl_generator.rb, line 23 def partition_statement(table_schema) return if table_schema.partitions.empty? <<~SQL PARTITIONED BY ( #{column_definition_sql(table_schema.partitions)} ) SQL end
permissive_statement(permissive_flag)
click to toggle source
# File lib/egis/table_ddl_generator.rb, line 19 def permissive_statement(permissive_flag) 'IF NOT EXISTS ' if permissive_flag end
row_format_statement(format)
click to toggle source
# File lib/egis/table_ddl_generator.rb, line 41 def row_format_statement(format) return serde_row_format_statement(format) if serde?(format) delimited_row_format_statement(format) end
serde?(format)
click to toggle source
# File lib/egis/table_ddl_generator.rb, line 37 def serde?(format) format.is_a?(Hash) && format.key?(:serde) end
serde_row_format_statement(format)
click to toggle source
# File lib/egis/table_ddl_generator.rb, line 47 def serde_row_format_statement(format) row_format = "ROW FORMAT SERDE '#{format[:serde]}'" return row_format unless format.key?(:serde_properties) serde_properties = format[:serde_properties].map { |property, value| "'#{property}' = '#{value}'" } <<-SQL #{row_format} WITH SERDEPROPERTIES ( #{serde_properties.join(",\n")} ) SQL end