blob: 758ce6a4e48891d396483d0a99c306b853c14bf5 [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
-->
<!DOCTYPE concept PUBLIC "-//OASIS//DTD DITA Concept//EN" "concept.dtd">
<concept id="string">
<title>STRING Data Type</title>
<titlealts audience="PDF"><navtitle>STRING</navtitle></titlealts>
<prolog>
<metadata>
<data name="Category" value="Impala"/>
<data name="Category" value="Impala Data Types"/>
<data name="Category" value="SQL"/>
<data name="Category" value="Data Analysts"/>
<data name="Category" value="Developers"/>
<data name="Category" value="Schemas"/>
</metadata>
</prolog>
<conbody>
<p>
A data type used in <codeph>CREATE TABLE</codeph> and <codeph>ALTER TABLE</codeph> statements.
</p>
<p conref="../shared/impala_common.xml#common/syntax_blurb"/>
<p>
In the column definition of a <codeph>CREATE TABLE</codeph> statement:
</p>
<codeblock><varname>column_name</varname> STRING</codeblock>
<p>
<b>Length:</b> Maximum of 32,767 bytes. Do not use any length constraint when declaring
<codeph>STRING</codeph> columns, as you might be familiar with from <codeph>VARCHAR</codeph>,
<codeph>CHAR</codeph>, or similar column types from relational database systems. <ph rev="2.0.0">If you do
need to manipulate string values with precise or maximum lengths, in Impala 2.0 and higher you can declare
columns as <codeph>VARCHAR(<varname>max_length</varname>)</codeph> or
<codeph>CHAR(<varname>length</varname>)</codeph>, but for best performance use <codeph>STRING</codeph>
where practical.</ph>
</p>
<p>
<b>Character sets:</b> For full support in all Impala subsystems, restrict string values to the ASCII
character set. Although some UTF-8 character data can be stored in Impala and retrieved through queries, UTF-8 strings
containing non-ASCII characters are not guaranteed to work properly in combination with many SQL aspects,
including but not limited to:
</p>
<ul>
<li>
String manipulation functions.
</li>
<li>
Comparison operators.
</li>
<li>
The <codeph>ORDER BY</codeph> clause.
</li>
<li>
Values in partition key columns.
</li>
</ul>
<p>
For any national language aspects such as
collation order or interpreting extended ASCII variants such as ISO-8859-1 or ISO-8859-2 encodings, Impala
does not include such metadata with the table definition. If you need to sort, manipulate, or display data
depending on those national language characteristics of string data, use logic on the application side.
</p>
<p>
<b>Conversions:</b>
</p>
<ul>
<li>
<p>
Impala does not automatically convert <codeph>STRING</codeph> to any numeric type. Impala does
automatically convert <codeph>STRING</codeph> to <codeph>TIMESTAMP</codeph> if the value matches one of
the accepted <codeph>TIMESTAMP</codeph> formats; see <xref href="impala_timestamp.xml#timestamp"/> for
details.
</p>
</li>
<li>
<p>
You can use <codeph>CAST()</codeph> to convert <codeph>STRING</codeph> values to
<codeph>TINYINT</codeph>, <codeph>SMALLINT</codeph>, <codeph>INT</codeph>, <codeph>BIGINT</codeph>,
<codeph>FLOAT</codeph>, <codeph>DOUBLE</codeph>, or <codeph>TIMESTAMP</codeph>.
</p>
</li>
<li>
<p>
You cannot directly cast a <codeph>STRING</codeph> value to <codeph>BOOLEAN</codeph>. You can use a
<codeph>CASE</codeph> expression to evaluate string values such as <codeph>'T'</codeph>,
<codeph>'true'</codeph>, and so on and return Boolean <codeph>true</codeph> and <codeph>false</codeph>
values as appropriate.
</p>
</li>
<li>
<p>
You can cast a <codeph>BOOLEAN</codeph> value to <codeph>STRING</codeph>, returning <codeph>'1'</codeph>
for <codeph>true</codeph> values and <codeph>'0'</codeph> for <codeph>false</codeph> values.
</p>
</li>
</ul>
<p conref="../shared/impala_common.xml#common/partitioning_blurb"/>
<p>
Although it might be convenient to use <codeph>STRING</codeph> columns for partition keys, even when those
columns contain numbers, for performance and scalability it is much better to use numeric columns as
partition keys whenever practical. Although the underlying HDFS directory name might be the same in either
case, the in-memory storage for the partition key columns is more compact, and computations are faster, if
partition key columns such as <codeph>YEAR</codeph>, <codeph>MONTH</codeph>, <codeph>DAY</codeph> and so on
are declared as <codeph>INT</codeph>, <codeph>SMALLINT</codeph>, and so on.
</p>
<p conref="../shared/impala_common.xml#common/zero_length_strings"/>
<!-- <p conref="../shared/impala_common.xml#common/hbase_blurb"/> -->
<!-- <p conref="../shared/impala_common.xml#common/parquet_blurb"/> -->
<p conref="../shared/impala_common.xml#common/text_bulky"/>
<p><b>Avro considerations:</b></p>
<p conref="../shared/impala_common.xml#common/avro_2gb_strings"/>
<!-- <p conref="../shared/impala_common.xml#common/compatibility_blurb"/> -->
<!-- <p conref="../shared/impala_common.xml#common/internals_blurb"/> -->
<!-- <p conref="../shared/impala_common.xml#common/added_in_20"/> -->
<p conref="../shared/impala_common.xml#common/column_stats_variable"/>
<p conref="../shared/impala_common.xml#common/example_blurb"/>
<p>
The following examples demonstrate double-quoted and single-quoted string literals, and required escaping for
quotation marks within string literals:
</p>
<codeblock>SELECT 'I am a single-quoted string';
SELECT "I am a double-quoted string";
SELECT 'I\'m a single-quoted string with an apostrophe';
SELECT "I\'m a double-quoted string with an apostrophe";
SELECT 'I am a "short" single-quoted string containing quotes';
SELECT "I am a \"short\" double-quoted string containing quotes";
</codeblock>
<p>
The following examples demonstrate calls to string manipulation functions to concatenate strings, convert
numbers to strings, or pull out substrings:
</p>
<codeblock>SELECT CONCAT("Once upon a time, there were ", CAST(3 AS STRING), ' little pigs.');
SELECT SUBSTR("hello world",7,5);
</codeblock>
<p>
The following examples show how to perform operations on <codeph>STRING</codeph> columns within a table:
</p>
<codeblock>CREATE TABLE t1 (s1 STRING, s2 STRING);
INSERT INTO t1 VALUES ("hello", 'world'), (CAST(7 AS STRING), "wonders");
SELECT s1, s2, length(s1) FROM t1 WHERE s2 LIKE 'w%';
</codeblock>
<p conref="../shared/impala_common.xml#common/related_info"/>
<p>
<xref href="impala_literals.xml#string_literals"/>, <xref href="impala_char.xml#char"/>,
<xref href="impala_varchar.xml#varchar"/>, <xref href="impala_string_functions.xml#string_functions"/>,
<xref href="impala_datetime_functions.xml#datetime_functions"/>
</p>
</conbody>
</concept>