Hive学习-数据查询语句
1.DQL查询语法
1)查询语法
hive> SELECT [ALL | DISTINCT] SELECT_expr, SELECT_expr, ... FROM table_reference
[WHERE WHERE_condition]
[GROUP BY col_list [HAVING condition]]
[CLUSTER BY col_list
| [DISTRIBUTE BY col_list] [SORT BY| ORDER BY col_list]
]
[LIMIT number]
2)案例
hive> SELECT id,name FROM students;
hive> SELECT st.id,st.name FROM students st;
3)注意
lORDER BY会对输入做全局排序,因此只有一个REDUCER,会导致当输入规模较大时,需要较长的计算时间。
lSORT BY不是全局排序,其在数据进入REDUCER前完成排序。因此,如果用SORT BY进行排序,并且设置mapred.reduce.tasks>1,则SORT BY只保证每个REDUCER的输出有序,不保证全局有序。
lDISTRIBUTE BY (字段)根据指定的字段将数据分到不同的REDUCER,且分发算法是hash散列。
lCLUSTER BY (字段) 除了具有DISTRIBUTE BY的功能外,还会对该字段进行排序。
l因此,如果分桶和sort字段是同一个时,此时, CLUSTER BY = 3) DISTRIBUTE BY SORT BY。
4)索引
hive> SELECT * FROM person;
1 elite0 10 ["basketball","music","dance"] {"adderss":"xx"}
2 elite1 20 ["basketball","music","dance"] {"adderss":"xx"}
3 elite2 10 ["basketball","music","dance"] {"adderss":"xx"}
4 elite3 20 ["basketball","music","dance"] {"adderss":"xx"}
5 elite4 10 ["basketball","music","dance"] {"adderss":"xx"}
6 elite5 20 ["basketball","music","dance"] {"adderss":"xx"}
Time taken: 0.129 seconds, Fetched: 6 row(s)
hive> SELECT id,name,age,likes[0],address["adderss"] FROM person;
1 elite0 10 basketball xx
2 elite1 20 basketball xx
3 elite2 10 basketball xx
4 elite3 20 basketball xx
5 elite4 10 basketball xx
6 elite5 20 basketball xx
Time taken: 0.104 seconds, Fetched: 6 row(s)
lList索引为column[i]:i:0,1,2,3…;
lMap索引为column[key]
5) 利用列计算
hive> SELECT id,info,year=2024 FROM part_student;
OK
1 {"name":"Jerry","age":"19"} false
2 {"name":"Tom","age":"19"} false
3 {"name":"Peter","age":"19"} false
4 {"name":"Jessca","age":"19"} false
…
23 {"name":"Xiang","age":"20"} true
24 {"name":"Kun","age":"20"} true
25 {"name":"Hunter","age":"20"} true
26 {"name":"Qian","age":"20"} true
27 {"name":"Yong","age":"20"} true
28 {"name":"Xiang","age":"20"} true
29 {"name":"Kun","age":"20"} true
30 {"name":"Hunter","age":"20"} true
6)limit语句
hive> SELECT * FROM part_student limit 5;
OK
1 {"name":"Jerry"} 2022 2 1
2 {"name":"Tom"} 2022 2 1
3 {"name":"Peter"} 2022 2 1
4 {"name":"Jessca"} 2022 2 1
5 {"name":"White"} 2022 2 1
Time taken: 0.091 seconds, Fetched: 5 row(s)
7)列别名
hive> SELECT id,info,year=2024 as checked_year FROM part_student limit 5;
OK
id info checked_year
1 {"name":"Jerry","age":"19"} false
2 {"name":"Tom","age":"19"} false
3 {"name":"Peter","age":"19"} false
4 {"name":"Jessca","age":"19"} false
5 {"name":"White","age":"18"} false
Time taken: 0.091 seconds, Fetched: 5 row(s)
8)CASE…WHEN… ELSE语句
hive>SELECT id,info,year,
CASE
WHEN year = 2024 THEN "一年级"
WHEN year = 2023 THEN "二年级"
WHEN year = 2022 THEN "三年级"
ELSE "未知"
END AS grade FROM part_student;
OK
d info year grade
1 {"name":"Jerry","age":"19"} 2022 三年级
2 {"name":"Tom","age":"19"} 2022 三年级
3 {"name":"Peter","age":"19"} 2022 三年级
4 {"name":"Jessca","age":"19"} 2022 三年级
5 {"name":"White","age":"18"} 2022 三年级
6 {"name":"Terry","age":"19"} 2022 三年级
…
9)禁止MapReduce
hive>set hive.exec.model.local.auto=true;
建议设置
10)WHERE语句
大于某个值是不包含null的,如上查询结果是把 get_json_object(sc.scores, '$.Chinese')为 null 的行剔除的。
语法
hive>SELECT field1,field2…,fieldn FROM table_name WHERE condition;
案例
hive>SELECT sc.student_id,
get_json_object(st.info, '$.name') AS name,
get_json_object(st.info, '$.age') AS age,
get_json_object(sc.scores, '$.Chinese') AS Chinese
FROM scores sc join part_student st on sc.student_id=st.id
WHERE get_json_object(sc.scores, '$.Chinese') >90;
OK
sc.student_id name age chinese
1 Jerry 19 91
2 Tom 19 97
3 Peter 19 92
4 Jessca 19 97
5 White 18 96
6 Terry 19 93
7 Zhi 19 96
10 Toy 19 94
11 Kerry 19 91
…
11)LIKE 和 RLIKE
A LIKE B | LIKE比较 | 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合表达式B 的正则语法,则为TRUE;如果字符串A不符合表达式B 的正则语法,否则为FALSE。B中字符'_'表示任意单个字符,而字符'%'表示任意数量的字符。 |
---|---|---|
A RLIKE B | JAVA的LIKE | 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合JAVA正则表达式B的正则语法,则为TRUE;如果字符串A不符合JAVA正则表达式B的正则语法,则为FALSE。 |
12)GROUP BY分组和HAVING
语法
SELECT field,avg(field) SELECT table_name GROUP BY field;
注意:
如果使用 GROUP BY分组,则SELECT后面只能写分组的字段或者聚合函数
WHERE和HAVING区别:
lHAVING是在 GROUP BY分完组后再对数据进行筛选,所以having 要筛选的字段只能是分组字段或者聚合函数。
lWHERE是从数据表中的字段直接进行的筛选的,所以不能跟在GROUP BY后面,也不能使用聚合函数。
案例
GROUP BY
hive>SELECT st.year,
AVG(CAST(get_json_object(sc.scores, '$.Chinese') AS INT)) AS avg_chinese,
AVG(CAST(get_json_object(sc.scores, '$.English') AS INT)) AS avg_english,
AVG(CAST(get_json_object(sc.scores, '$.mathematics') AS INT)) AS avg_mathematics,
AVG(CAST(get_json_object(sc.scores, '$.Physics') AS INT)) AS avg_physics,
AVG(CAST(get_json_object(sc.scores, '$.Chemistry') AS INT)) AS avg_chemistry
FROM scores sc
JOIN part_student st ON sc.student_id = st.id
GROUP BY st.year;
2022 83.6 92.8 80.7 83.4 89.0
2023 92.0 93.1 81.8 83.4 91.2
2024 91.0 91.1 82.8 84.4 89.2
Time taken: 9.769 seconds, Fetched: 3 row(s)
HAVING
hive>SELECT st.year,
AVG(CAST(get_json_object(sc.scores, '$.Chinese') AS INT)) AS avg_chinese,
AVG(CAST(get_json_object(sc.scores, '$.English') AS INT)) AS avg_english,
AVG(CAST(get_json_object(sc.scores, '$.mathematics') AS INT)) AS avg_mathematics,
AVG(CAST(get_json_object(sc.scores, '$.Physics') AS INT)) AS avg_physics,
AVG(CAST(get_json_object(sc.scores, '$.Chemistry') AS INT)) AS avg_chemistry
FROM scores sc
JOIN part_student st ON sc.student_id = st.id
GROUP BY st.year
Having avg_chinese>=90;
OK
2023 92.0 93.1 81.8 83.4 91.2
2024 91.0 91.1 82.8 84.4 89.2
2.Hive函数
1)聚合函数
函数 | 作用 | 解析 | 返回值 |
---|---|---|---|
count(*) | 所有的不包含null值的行数 | 包含null值 | |
count(id) | 统计所有行数 | 不包含null值 | |
max() | 求最大值 | 不包含null,除非所有值都是null | |
min() | 求最小值 | 不包含null,除非所有值都是null | |
avg() | 求平均值 | 不包含null | |
var_pop(col) | 非空集合总体变量函数 | 忽略null | double |
var_samp (col) | 非空集合样本变量函数 | 忽略null | double |
stddev_pop(col) | 该函数计算总体标准偏离 | 并返回总体变量的平方根,其返回值与VAR_POP函数的平方根相同 | double |
percentile(BIGINT col, p) | 求准确的第pth个百分位数 | p必须介于0和1之间,但是col字段目前只支持整数,不支持浮点数类型 | double |
2)关系运算(一)
函数 | 作用 | 返回值 |
---|---|---|
= | 等于 | TRUE|FALSE |
!= 或 <> | 不等于 | TRUE|FALSE |
< | 小于 | TRUE|FALSE |
<= | 小于等于 | TRUE|FALSE |
> | 大于 | TRUE|FALSE |
>= | 大于等于 | TRUE|FALSE |
is null | 空值判断 | TRUE|FALSE |
is not null | 非空判断 | TRUE|FALSE |
3)关系运算(二)
函数 | 作用 | 解析 | 返回值 |
---|---|---|---|
A LIKE B | LIKE比较 | 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合表达式B 的正则语法,则为TRUE;如果字符串A不符合表达式B 的正则语法,否则为FALSE。B中字符'_'表示任意单个字符,而字符'%'表示任意数量的字符。 | NULL|TRUE|FALSE |
A RLIKE B | JAVA的LIKE | 如果字符串A或者字符串B为NULL,则返回NULL;如果字符串A符合JAVA正则表达式B的正则语法,则为TRUE;如果字符串A不符合JAVA正则表达式B的正则语法,则为FALSE。 | NULL|TRUE|FALSE |
A REGEXP B | 功能与RLIKE相同 | SELECT 1 FROM tablenamee WHERE 'footbar' REGEXP '^f.*r$'; | NULL|TRUE|FALSE |
4)数学运算
函数 | 作用 |
---|---|
| 加 |
- | 减 |
* | 乘 |
/ | 除 |
% | 取余 |
& | 位与 |
| | 位或 |
^ | 位异或 |
~ | 位取反 |
5)逻辑运算
函数 | 作用 |
---|---|
and | 逻辑与 |
or | 逻辑或 |
not | 逻辑非 |
6)数值运算
函数 | 作用 | 解析 | 返回值 |
---|---|---|---|
round(double a) | 取整函数 | 返回double类型的整数值部分 (遵循四舍五入)hive>SELECT round(3.1415926) FROM tablenamee; 3 | BIGINT |
round(double a, int d) | 指定精度取整函数 | 返回指定精度d的double类型hive>SELECT round(3.1415926,4) FROM tablenamee;3.1416 | DOUBLE |
floor(double a) | 向下取整函数 | 返回等于或者小于该double变量的最大的整数hive>SELECT floor(3.641) FROM tablenamee;3 | BIGINT |
ceil(double a) | 向上取整函数 | 返回等于或者大于该double变量的最小的整数 hive>SELECT ceil(3.1415926) FROM tablenamee;4 | BIGINT |
rand(),rand(int seed) | 取随机数函数 | 返回一个0到1范围内的随机数。如果指定种子seed,则会等到一个稳定的随机数序列hive>SELECT rand() FROM tablenamee; -- 每次执行此语句得到的结果都不同0.5577432776034763hive>SELECT rand(100) ; -- 只要指定种子,每次执行此语句得到的结果一样的0.7220096548596434 | DOUBLE |
exp(double a) | 自然指数函数 | 返回自然对数e的a次方hive>SELECT exp(2) ;7.38905609893065 | DOUBLE |
log10(double a) | 以10为底对数函数 | hive>返回以10为底的a的对数SELECT log10(100) ;2.0 | DOUBLE |
log2() | 以2为底对数函数 | ||
log() | 对数函数 | ||
pow(double a, double p) | 幂运算函数 | 返回a的p次幂hive> SELECT pow(2,4) ;16.0 | DOUBLE |
sqrt(double a) | 开平方函数 | 返回a的平方根hive> SELECT sqrt(16) ;4.0 | DOUBLE |
bin(BIGINT a) | 二进制函数 | 返回a的二进制代码表示hive> SELECT bin(7) ;111 | string |
hex() | 十六进制函数 | ||
unhex() | 将十六进制转化为字符串函数 | ||
conv(bigint num, int FROM_base, int to_base) | 进制转换函数 | 将数值num从FROM_base进制转化到to_base进制 | |
abs() | 绝对值函数 | ||
pmod() | 正取余函数 | ||
sin() | 正弦函数 | ||
asin() | 反正弦函数 | ||
cos() | 余弦函数 | ||
acos() | 反余弦函数 | ||
positive() | positive函数 | ||
negative() | negative函数 |
7)条件函数
函数 | 作用 | 解析 | 返回值 |
---|---|---|---|
if(boolean testCondition, T valueTrue, T valueFalseOrNull) | If函数 | 当条件testCondition为TRUE时,返回valueTrue;否则返回valueFalseOrNullhive> SELECT if(1=2,100,200) ;200hive> SELECT if(1=1,100,200) ;100 | T |
coalesce(T"v1,"T"v2,"…) | 非空查找函数 | 返回参数中的第一个非空值;如果所有值都为NULL,那么返回NULLhive> SELECT coalesce(null,'100','50') ;100 | T |
case when a then b [when c then d]* [else e] end | 条件判断函数(两种写法,其一) | 如果a为TRUE,则返回b;如果c为TRUE,则返回d;否则返回e hive> SELECT case when 1=2 then 'tom' when 2=2 then 'mary' else 'tim' end FROM tablenamee; mary | T |
case a when b then c [when d then e]* [else f] end | 条件判断函数(两种写法,其二) | 如果a等于b,那么返回c;如果a等于d,那么返回e;否则返回fhive> SELECT case 100 when 50 then 'tom' when 100 then 'mary' else 'tim' end FROM tablenamee; mary | T |
8)日期函数
以下SQL语句中的 FROM tablenamee 可去掉,不影响查询结果。
函数 | 作用 | 解析 | 返回值 |
---|---|---|---|
unix_timestamp() | 获得当前时区的UNIX时间戳 | hive> SELECT unix_timestamp() 1616906976 | bigint |
FROM_unixtime(bigint unixtime[, string format]) | 转化UNIX时间戳(从1970-01-01 00:00:00 UTC到指定时间的秒数)到当前时区的时间格式 | hive> SELECT FROM_unixtime(1616906976,'yyyyMMdd') ;20210328 | string |
unix_timestamp(string date, string pattern) | 转换pattern格式的日期到UNIX时间戳。如果转化失败,则返回0。 | hive> SELECT unix_timestamp('2021-03-08 14:21:15','yyyyMMdd HH:mm:ss') ;1615184475 | bigint |
to_date(string timestamp) | 返回日期时间字段中的日期部分 | hive> SELECT to_date('2021-03-28 14:03:01'); 2021-03-28 | string |
year(string date) | 返回日期中的年 | hive> SELECT year('2021-03-28 10:03:01'); 2021SELECT year('2021-03-28'); 2021 | int |
month (string date) | 返回日期中的月份 | hive> SELECT month('2020-12-28 12:03:01') ;12hive> SELECT month('2021-03-08') ;8 | int |
day (string date) | 返回日期中的天 | hive> SELECT day('2020-12-08 10:03:01') ;8SELECT day('2020-12-24') ;24 | int |
hour (string date) | 返回日期中的小时 | hive> SELECT hour('2020-12-08 10:03:01') ;10 | int |
minute (string date) | 返回日期中的分钟 | hive> SELECT minute('2020-12-08 10:03:01') ; 3 | int |
second (string date) | 返回日期中的秒 | hive> SELECT second('2020-12-08 10:03:01') ;1 | int |
weekofyear (string date) | 返回日期在当年的周数 | hive> SELECT weekofyear('2020-12-08 10:03:01');49 | int |
datediff(string enddate, string startdate) | 返回结束日期减去开始日期的天数 | hive> SELECT datediff('2020-12-08','2020-05-09') ;213 | Int |
date_add(string startdate, int days) | 返回开始日期startdate增加days天后的日期 | hive> SELECT date_add('2020-12-08',10) ;2020-12-18 | string |
date_sub (string startdate, int days) | 返回开始日期startdate减少days天后的日期 | hive> SELECT date_sub('2020-12-08',10) ;2020-11-28 | string |
unix_timestamp(string date) | 转换格式为"yyyy-MM-dd HH:mm:ss"的日期到UNIX时间戳。如果转化失败,则返回0。 | hive> SELECT unix_timestamp('2021-03-08 14:21:15') ;1615184475 | bigint |
9)字符串函数
函数 | 作用 | 解析 | 返回值 |
---|---|---|---|
length(string A) | 返回字符串A的长度 | hive> SELECT length('abcedfg');7 | int |
reverse(string A) | 返回字符串A的反转结果 | hive> SELECT reverse('abcedfg') ;gfdecba | string |
concat(string A, string B…) | 返回输入字符串连接后的结果,支持任意个输入字符串 | hive> SELECT concat('abc','def','gh') ; abcdefgh | string |
concat_ws(string SEP, string A, string B…) | 返回输入字符串连接后的结果,SEP表示各个字符串间的分隔符 | hive> SELECT concat_ws(',','abc','def','gh');gabc,def,gh | string |
substr(string A, int start)substring(string A, int start) | 返回字符串A从start位置到结尾的字符串 | hive> SELECT substr('abcde',3);cdehive> SELECT substring('abcde',3) ;cdehive> SELECT substr('abcde',-1) ;e | string |
substr(string A, int start, int len)substring(string A, int start, int len) | 返回字符串A从start位置开始,长度为len的字符串 | hive> SELECT substr('abcde',3,2) ;cd hive> SELECT substring('abcde',3,2) ;cdhive> SELECT substring('abcde',-2,2) FROM tablename;de | string |
upper(string A) ucase(string A) | 返回字符串A的大写格式 | hive> SELECT upper('abSEd');ABSEDhive> SELECT ucase('abSEd');ABSED | string |
lower(string A)lcase(string A) | 返回字符串A的小写格式 | hive> SELECT lower('abSEd');absedhive> SELECT lcase('abSEd'); absed | string |
trim(string A) | 去除字符串两边的空格 | hive> SELECT trim(' abc ');abc | string |
ltrim(string A) | 去除字符串左边的空格 | hive> SELECT ltrim(' abc ');abc | string |
rtrim(string A) | 去除字符串右边的空格 | hive>SELECT rtrim(' abc '); abc | string |
regexp_replace(string A, string B, string C) | 将字符串A中的符合java正则表达式B的部分替换为C。注意,在有些情况下要使用转义字符,类似oracle中的regexp_replace函数。 | hive>SELECT regexp_replace('foobar', 'oo|ar', '');fb | string |
regexp_extract(string subject, string pattern, int index) | 将字符串subject按照pattern正则表达式的规则拆分,返回index指定的字符。 | hive>SELECT regexp_extract('foothebar', 'foo(.*?)(bar)', 1); thehive>SELECT regexp_extract('foothebar', 'foo(.*?)(bar)', 2);barhive>SELECT regexp_extract('foothebar', 'foo(.*?)(bar)', 0);foothebar | String |
注意,在有些情况下要使用转义字符,下面的等号要用双竖线转义,这是java正则表达式的规则。SELECT data_field,regexp_extract(data_field,'.*?bgStart\=([^&] )',1) as aaa,regexp_extract(data_field,'.*?contentLoaded_headStart\=([^&] )',1) as bbb,regexp_extract(data_field,'.*?AppLoad2Req\=([^&] )',1) as ccc FROM pt_nginx_loginlog_st WHERE pt = '2021-03-28' limit 2; | |||
parse_url(string urlString, string partToExtract [, string keyToExtract]) | 返回URL中指定的部分。partToExtract的有效值为:HOST, PATH, QUERY, REF,PROTOCOL, AUTHORITY, FILE, and USERINFO. | hive>SELECT parse_url('https://www.tableName.com/path1/p.php?k1=v1&k2=v2#Ref1', 'HOST');www.tableName.com hive>SELECT parse_url('https://www.tableName.com/path1/p.php?k1=v1&k2=v2#Ref1', 'QUERY', 'k1');v1 | |
get_json_object(string json_string, string path) | 解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。 | hive>SELECT get_json_object('{"store":{"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}], "bicycle":{"price":19.95,"color":"red"} },"email":"amy@only_for_json_udf_test.net","owner":"amy"}','$.owner'); amy | |
space(int n) | 返回长度为n的字符串 | hive>SELECT space(10);hive>SELECT length(space(10));10 | string |
repeat(string str, int n) | 返回重复n次后的str字符串 | hive>SELECT repeat('abc',5);abcabcabcabcabc | string |
ascii(string str) | 返回字符串str第一个字符的ascii码 | hive>SELECT ascii('abcde');97 | int |
lpad(string str, int len, string pad) | 将str进行用pad进行左补足到len位 | hive>SELECT lpad('abc',10,'td');tdtdtdtabc注意:与GP,ORACLE不同,pad 不能默认 | string |
rpad(string str, int len, string pad) | 将str进行用pad进行右补足到len位 | hive> SELECT rpad('abc',10,'td');abctdtdtdt | string |
split(string str, string pat) | 按照pat字符串分割str,会返回分割后的字符串数组 | hive>SELECT split('abtcdtef','t');["ab","cd","ef"] | array |
find_in_set(string str, string strList) | 返回str在strlist第一次出现的位置,strlist是用逗号分割的字符串。如果没有找该str字符,则返回0 | hive>SELECT find_in_set('ab','ef,ab,de');2hive>SELECT find_in_set('at','ef,ab,de');0 | int |
3. 复合类型
1)构建操作
语法 | 说明及案例 |
---|---|
map (key1, value1, key2, value2, …) | 根据输入的key和value对构建map类型hive>CREATE table mapTable as SELECT map('100','tom','200','mary') as t FROM tableName;hive> describe mapTable;t maphive> SELECT t FROM tableName;{"100":"tom","200":"mary"} |
struct(val1, val2, val3, …) | 根据输入的参数构建结构体struct类型hive> CREATE table struct_table as SELECT struct('tom','mary','tim') as t FROM tableName;hive> describe struct_table;t struct hive> SELECT t FROM tableName;{"col1":"tom","col2":"mary","col3":"tim"} |
array(val1, val2, …) | 根据输入的参数构建数组array类型hive> CREATE table arr_table as SELECT array("tom","mary","tim") as t FROM tableName;hive> describe tableName;t arrayhive> SELECT t FROM tableName;["tom","mary","tim"] |
2)访问操作
语法 | 操作类型 | 说明及案例 |
---|---|---|
array类型:A[n] | A为array类型n为int类型 | 返回数组A中的第n个变量值。数组的起始下标为0。比如,A是个值为['foo', 'bar']的数组类型,那么A[0]将返回'foo',而A[1]将返回'bar'hive>CREATE table arr_table2 as SELECT array("tom","mary","tim") as tFROM tableName;hive> SELECT t[0],t[1] FROM arr_table2; tom mary |
map类型:M[key] | M为map类型key为map中的key值 | 返回map类型M中,key值为指定值的value值。比如,M是值为{'f' -> 'foo', 'b' -> 'bar', 'all' -> 'foobar'}的map类型,那么M['all']将会返回'foobar'hive> Create table map_table2 as SELECT map('100','tom','200','mary') as t FROM tableName;hive> SELECT t['200'],t['100'] FROM map_table2;mary tom |
struct类型:S.x | S为struct类型 | 返回结构体S中的x字段。比如,对于结构体struct foobar {int foo, int bar},foobar.foo返回结构体中的foo字段hive> CREATE table str_table2 as SELECT struct('tom','mary','tim') as t FROM tableName;hive> describe tableName;t structhive> SELECT t.col1,t.col3 FROM str_table2; tom tim |
3)长度统计函数
语法 | 说明及案例 | 返回值 |
---|---|---|
size(Map) | 返回map类型的长度hive> SELECT size(t) FROM map_table2;2 | int |
size(Array) | 返回array类型的长度hive> SELECT size(t) FROM arr_table2;4 | Int |
cast(expr as ) | 返回转换后的数据类型hive> SELECT cast('1' as bigint) FROM tableName;1 | expected "=" to follow "type" |