当前位置:文档之家› Hadoop Hive sql语法详解

Hadoop Hive sql语法详解

Hadoop Hive sql语法详解
Hadoop Hive sql语法详解

Hadoop Hive sql语法详解

Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构化的数据文件映射为一张数据库表,并提供完整的SQL查询功能,可以将SQL语句转换为MapReduce任务进行运行,通过自己的SQL 去查询分析需要的内容,这套SQL 简称Hive SQL,使不熟悉mapreduce 的用户很方便的利用SQL 语言查询,汇总,分析数据。而mapreduce开发人员可以把己写的mapper 和reducer 作为插件来支持Hive 做更复杂的数据分析。

它与关系型数据库的SQL 略有不同,但支持了绝大多数的语句如DDL、DML 以及常见的聚合函数、连接查询、条件查询。HIVE不适合用于联机online)事务处理,也不提供实时查询功能。它最适合应用在基于大量不可变数据的批处理作业。

HIVE的特点:可伸缩(在Hadoop的集群上动态的添加设备),可扩展,容错,输入格式的松散耦合。

Hive 的官方文档中对查询语言有了很详细的描述,请参考:

https://www.doczj.com/doc/a76896253.html,/hadoop/Hive/LanguageManual ,本文的内容大部分翻译自该页面,期间加入了一些在使用过程中需要注意到的事项。

1. DDL 操作

DDL

?建表

?删除表

?修改表结构

?创建/删除视图

?创建数据库

?显示命令

建表:

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

[(col_name data_type [COMMENT col_comment], ...)]

[COMMENT table_comment]

[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]

[CLUSTERED BY (col_name, col_name, ...)

[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS]

[ROW FORMAT row_format]

[STORED AS file_format]

[LOCATION hdfs_path]

?CREATE TABLE 创建一个指定名字的表。如果相同名字的表已经存在,则抛出异常;用户可以用IF NOT EXIST 选项来忽略这个异常

?EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION)

?LIKE 允许用户复制现有的表结构,但是不复制数据

?COMMENT可以为表与字段增加描述

?ROW FORMAT

DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]

[MAP KEYS TERMINATED BY char] [LINES TERMINATED BY char]

| SERDE serde_name [WITH SERDEPROPERTIES (property_name=property_value,

property_name=property_value, ...)]

用户在建表的时候可以自定义SerDe 或者使用自带的SerDe。如果没有指定ROW FORMAT 或者ROW FORMAT DELIMITED,将会使用自带的SerDe。在建表的时候,用户还需要为表指定列,用户在指定表的列的同时也会指定自定义的SerDe,Hive 通过SerDe 确定表的具体的列的数据。

?STORED AS

SEQUENCEFILE

| TEXTFILE

| RCFILE

| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用STORED AS SEQUENCE 。

创建简单表:

hive> CREATE TABLE pokes (foo INT, bar STRING);

创建外部表:

CREATE EXTERNAL TABLE page_view(viewTime INT, userid BIGINT,

page_url STRING, referrer_url STRING,

ip STRING COMMENT 'IP Address of the User',

country STRING COMMENT 'country of origination')

COMMENT 'This is the staging page view table'

ROW FORMAT DELIMITED FIELDS TERMINATED BY '\054'

STORED AS TEXTFILE

LOCATION '';

建分区表

CREATE TABLE par_table(viewTime INT, userid BIGINT,

page_url STRING, referrer_url STRING,

ip STRING COMMENT 'IP Address of the User')

COMMENT 'This is the page view table'

PARTITIONED BY(date STRING, pos STRING)

ROW FORMAT DELIMITED ‘\t’

FIELDS TERMINATED BY '\n'

STORED AS SEQUENCEFILE;

建Bucket表

CREATE TABLE par_table(viewTime INT, userid BIGINT,

page_url STRING, referrer_url STRING,

ip STRING COMMENT 'IP Address of the User')

COMMENT 'This is the page view table'

PARTITIONED BY(date STRING, pos STRING)

CLUSTERED BY(userid) SORTED BY(viewTime) INTO 32 BUCKETS

ROW FORMAT DELIMITED ‘\t’

FIELDS TERMINATED BY '\n'

STORED AS SEQUENCEFILE;

创建表并创建索引字段ds

hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);

复制一个空表

CREATE TABLE empty_key_value_store

LIKE key_value_store;

例子

create table user_info (user_id int, cid string, ckid string, username string)

row format delimited

fields terminated by '\t'

lines terminated by '\n';

导入数据表的数据格式是:字段之间是tab键分割,行之间是断行。

及要我们的文件内容格式:

100636 100890 c5c86f4cddc15eb7 yyyvybtvt

100612 100865 97cc70d411c18b6f gyvcycy

100078 100087 ecd6026a15ffddf5 qa000100

显示所有表:

hive> SHOW TABLES;

按正条件(正则表达式)显示表,

hive> SHOW TABLES '.*s';

修改表结构

?增加分区、删除分区

?重命名表

?修改列的名字、类型、位置、注释

?增加/更新列

?增加表的元数据信息

表添加一列:

hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);

添加一列并增加列字段注释

hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');

更改表名:

hive> ALTER TABLE events RENAME TO 3koobecaf;

删除列:

hive> DROP TABLE pokes;

增加、删除分区

?增加

ALTER TABLE table_name ADD [IF NOT EXISTS] partition_spec [ LOCATION 'location1' ] partition_spec [ LOCATION 'location2' ] ...

partition_spec:

: PARTITION (partition_col = partition_col_value, partition_col = partiton_col_value, ...) ?删除

ALTER TABLE table_name DROP partition_spec, partition_spec,...

重命名表

?ALTER TABLE table_name RENAME TO new_table_name

修改列的名字、类型、位置、注释:

?ALTER TABLE table_name CHANGE [COLUMN] col_old_name col_new_name column_type [COMMENT col_comment] [FIRST|AFTER column_name]

?这个命令可以允许改变列名、数据类型、注释、列位置或者它们的任意组合

表添加一列:

hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);

添加一列并增加列字段注释

hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');

增加/更新列

?ALTER TABLE table_name ADD|REPLACE COLUMNS (col_name data_type [COMMENT

col_comment], ...)

? ADD是代表新增一字段,字段位置在所有列后面(partition列前)

REPLACE则是表示替换表中所有字段。

增加表的元数据信息

?ALTER TABLE table_name SET TBLPROPERTIES table_properties table_properties:

:[property_name = property_value…..]

?用户可以用这个命令向表中增加metadata

改变表文件格式与组织

?ALTER TABLE table_name SET FILEFORMAT file_format

?ALTER TABLE table_name CLUSTERED BY(userid) SORTED BY(viewTime) INTO num_buckets BUCKETS

?这个命令修改了表的物理存储属性

创建/删除视图

?CREATE VIEW [IF NOT EXISTS] view_name [ (column_name [COMMENT

column_comment], ...) ][COMMENT view_comment][TBLPROPERTIES (property_name = property_value, ...)] AS SELECT

?增加视图

?如果没有提供表名,视图列的名字将由定义的SELECT表达式自动生成

?如果修改基本表的属性,视图中不会体现,无效查询将会失败

?视图是只读的,不能用LOAD/INSERT/ALTER

?DROP VIEW view_name

?删除视图

创建数据库

?CREATE DATABASE name

显示命令

?show tables;

?show databases;

?show partitions ;

?show functions

?describe extended table_name dot col_name

2. DML 操作:元数据存储

hive不支持用insert语句一条一条的进行插入操作,也不支持update操作。数据是以load 的方式加载到建立好的表中。数据一旦导入就不可以修改。

DML包括:INSERT插入、UPDATE更新、DELETE删除

?向数据表内加载文件

?将查询结果插入到Hive表中

?0.8新特性insert into

向数据表内加载文件

?LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

?Load 操作只是单纯的复制/移动操作,将数据文件移动到Hive 表对应的位置。

?filepath

?相对路径,例如:project/data1

?绝对路径,例如:/user/hive/project/data1

?包含模式的完整URI,例如:hdfs://namenode:9000/user/hive/project/data1

例如:

hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

加载本地数据,同时给定分区信息

?加载的目标可以是一个表或者分区。如果表包含分区,必须指定每一个分区的分区名

?filepath 可以引用一个文件(这种情况下,Hive 会将文件移动到表所对应的目录中)或者是一个目录(在这种情况下,Hive 会将目录中的所有文件移动至表所对应的目录中)LOCAL关键字

?指定了LOCAL,即本地

?load 命令会去查找本地文件系统中的filepath。如果发现是相对路径,则路径会被解释为相对于当前用户的当前路径。用户也可以为本地文件指定一个完整的URI,比如:

file:///user/hive/project/data1.

?load 命令会将filepath 中的文件复制到目标文件系统中。目标文件系统由表的位置属性决定。被复制的数据文件移动到表的数据对应的位置

例如:加载本地数据,同时给定分区信息:

hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

? 没有指定LOCAL

如果filepath 指向的是一个完整的URI,hive 会直接使用这个URI。否则

?如果没有指定schema 或者authority,Hive 会使用在hadoop 配置文件中定义的schema 和authority,https://www.doczj.com/doc/a76896253.html, 指定了Namenode 的URI

?如果路径不是绝对的,Hive 相对于/user/ 进行解释。Hive 会将filepath 中指定的文件内容移动到table (或者partition)所指定的路径中

加载DFS数据,同时给定分区信息:

hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

The above command will load data from an HDFS file/directory to the table. Note that loading data from HDFS will result in moving the file/directory. As a result, the operation is almost instantaneous.

OVERWRITE

?指定了OVERWRITE

?目标表(或者分区)中的内容(如果有)会被删除,然后再将filepath 指向的文件/目录中的内容添加到表/分区中。

?如果目标表(分区)已经有一个文件,并且文件名和filepath 中的文件名冲突,那么现有的文件会被新文件所替代。

将查询结果插入Hive表

?将查询结果插入Hive表

?将查询结果写入HDFS文件系统

?基本模式

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)]

select_statement1 FROM from_statement

?多插入模式

FROM from_statement

INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)]

select_statement1

[INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ...

?自动分区模式

INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...)

select_statement FROM from_statement

将查询结果写入HDFS文件系统

?INSERT OVERWRITE [LOCAL] DIRECTORY directory1 SELECT ... FROM ...

FROM from_statement

INSERT OVERWRITE [LOCAL] DIRECTORY directory1 select_statement1

[INSERT OVERWRITE [LOCAL] DIRECTORY directory2 select_statement2]

?

?数据写入文件系统时进行文本序列化,且每列用^A 来区分,\n换行

INSERT INTO

?INSERT INTO TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)] select_statement1 FROM from_statement

3. DQL 操作:数据查询SQL

SQL操作

?基本的Select 操作

?基于Partition的查询

?Join

3.1 基本的Select 操作

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]

?使用ALL和DISTINCT选项区分对重复记录的处理。默认是ALL,表示查询所有记录。DISTINCT 表示去掉重复的记录

?

?Where 条件

?类似我们传统SQL的where 条件

?目前支持AND,OR ,0.9版本支持between

?IN, NOT IN

?不支持EXIST ,NOT EXIST

ORDER BY与SORT BY的不同

?ORDER BY 全局排序,只有一个Reduce任务

?SORT BY 只在本机做排序

Limit

?Limit 可以限制查询的记录数

SELECT * FROM t1 LIMIT 5

?实现Top k 查询

?下面的查询语句查询销售记录最大的5 个销售代表。

SET mapred.reduce.tasks = 1

SELECT * FROM test SORT BY amount DESC LIMIT 5

?REGEX Column Specification

SELECT 语句可以使用正则表达式做列选择,下面的语句查询除了ds 和hr 之外的所有列:SELECT `(ds|hr)?+.+` FROM test

例如

按先件查询

hive> SELECT a.foo FROM invites a WHERE a.ds='';

将查询数据输出至目录:

hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE

a.ds='';

将查询结果输出至本地目录:

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

选择所有列到本地目录:

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;

hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a; hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(1) FROM invites a WHERE

a.ds='';

hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;

将一个表的统计结果插入另一个表中:

hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(1) WHERE a.foo > 0 GROUP BY a.bar;

hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;

JOIN

hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;

将多表数据插入到同一表中:

FROM src

INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100

INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200

INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300; 将文件流直接插入文件:

hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';

This streams the data in the map phase through the script /bin/cat (like hadoop streaming). Similarly - streaming can be used on the reduce side (please see the Hive Tutorial or examples)

3.2 基于Partition的查询

?一般SELECT 查询会扫描整个表,使用PARTITIONED BY 子句建表,查询就可以利用分区剪枝(input pruning)的特性

?Hive 当前的实现是,只有分区断言出现在离FROM 子句最近的那个WHERE 子句中,才会启用分区剪枝

3.3 Join

Syntax

join_table:

table_reference JOIN table_factor [join_condition]

| table_reference {LEFT|RIGHT|FULL} [OUTER] JOIN table_reference join_condition

| table_reference LEFT SEMI JOIN table_reference join_condition

table_reference:

table_factor

| join_table

table_factor:

tbl_name [alias]

| table_subquery alias

| ( table_references )

join_condition:

ON equality_expression ( AND equality_expression )*

equality_expression:

expression = expression

?Hive 只支持等值连接(equality joins)、外连接(outer joins)和(left semi joins)。Hive 不支持所有非等值的连接,因为非等值连接非常难转化到map/reduce 任务

?LEFT,RIGHT和FULL OUTER关键字用于处理join中空记录的情况

?LEFT SEMI JOIN 是IN/EXISTS 子查询的一种更高效的实现

?join 时,每次map/reduce 任务的逻辑是这样的:reducer 会缓存join 序列中除了最后一个表的所有表的记录,再通过最后一个表将结果序列化到文件系统

?实践中,应该把最大的那个表写在最后

join 查询时,需要注意几个关键点

?只支持等值join

?SELECT a.* FROM a JOIN b ON (a.id = b.id)

?SELECT a.* FROM a JOIN b

ON (a.id = b.id AND a.department = b.department)

?可以join 多于2 个表,例如

SELECT a.val, b.val, c.val FROM a JOIN b

ON (a.key = b.key1) JOIN c ON (c.key = b.key2)

?如果join中多个表的join key 是同一个,则join 会被转化为单个map/reduce 任务LEFT,RIGHT和FULL OUTER

?例子

?SELECT a.val, b.val FROM a LEFT OUTER JOIN b ON (a.key=b.key)

?如果你想限制join 的输出,应该在WHERE 子句中写过滤条件——或是在join 子句中写?

?容易混淆的问题是表分区的情况

? SELECT c.val, d.val FROM c LEFT OUTER JOIN d ON (c.key=d.key)

WHERE a.ds='2010-07-07' AND b.ds='2010-07-07‘

?如果d 表中找不到对应c 表的记录,d 表的所有列都会列出NULL,包括ds 列。也就是说,join 会过滤 d 表中不能找到匹配c 表join key 的所有记录。这样的话,LEFT OUTER 就使得查询结果与WHERE 子句无关

?解决办法

?SELECT c.val, d.val FROM c LEFT OUTER JOIN d

ON (c.key=d.key AND d.ds='2009-07-07' AND c.ds='2009-07-07')

LEFT SEMI JOIN

?LEFT SEMI JOIN 的限制是,JOIN 子句中右边的表只能在ON 子句中设置过滤条件,在WHERE 子句、SELECT 子句或其他地方过滤都不行

?

?SELECT a.key, a.value

FROM a

WHERE a.key in

(SELECT b.key

FROM B);

可以被重写为:

SELECT a.key, a.val

FROM a LEFT SEMI JOIN b on (a.key = b.key)

UNION ALL

?用来合并多个select的查询结果,需要保证select中字段须一致

?select_statement UNION ALL select_statement UNION ALL select_statement ...

4. 从SQL到HiveQL应转变的习惯

1、Hive不支持等值连接

?SQL中对两表内联可以写成:

?select * from dual a,dual b where a.key = b.key;

?Hive中应为

?select * from dual a join dual b on a.key = b.key;

而不是传统的格式:

SELECT t1.a1 as c1, t2.b1 as c2FROM t1, t2 WHERE t1.a2 = t2.b2

2、分号字符

?分号是SQL语句结束标记,在HiveQL中也是,但是在HiveQL中,对分号的识别没有那么智慧,例如:

?select concat(key,concat(';',key)) from dual;

?但HiveQL在解析语句时提示:

FAILED: Parse Error: line 0:-1 mismatched input '' expecting ) in function specification

?解决的办法是,使用分号的八进制的ASCII码进行转义,那么上述语句应写成:

?select concat(key,concat('\073',key)) from dual;

3、IS [NOT] NULL

?SQL中null代表空值, 值得警惕的是, 在HiveQL中String类型的字段若是空(empty)字符串, 即长度为0, 那么对它进行IS NULL的判断结果是False.

4、Hive不支持将数据插入现有的表或分区中,

仅支持覆盖重写整个表,示例如下:

[sql] view plaincopyprint?

1. INSERT OVERWRITE TABLE t1

2. SELECT * FROM t2;

4、hive不支持INSERT INTO, UPDATE, DELETE操作

这样的话,就不要很复杂的锁机制来读写数据。

INSERT INTO syntax is only available starting in version 0.8。INSERT INTO就是在表或分区中追加数据。

5、hive支持嵌入mapreduce程序,来处理复杂的逻辑

如:

[sql] view plaincopyprint?

1. FROM (

2. MAP doctext USING 'python wc_mapper.py' AS (word, cnt)

3. FROM docs

4. CLUSTER BY word

5. ) a

6. REDUCE word, cnt USING 'python wc_reduce.py';

--doctext: 是输入

--word, cnt: 是map程序的输出

--CLUSTER BY: 将wordhash后,又作为reduce程序的输入

并且map程序、reduce程序可以单独使用,如:

[sql] view plaincopyprint?

1. FROM (

2. FROM session_table

3. SELECT sessionid, tstamp, data

4. DISTRIBUTE BY sessionid SORT BY tstamp

5. ) a

6. REDUCE sessionid, tstamp, data USING 'session_reducer.sh';

--DISTRIBUTE BY: 用于给reduce程序分配行数据

6、hive支持将转换后的数据直接写入不同的表,还能写入分区、hdfs和本地目录。这样能免除多次扫描输入表的开销。

[sql] view plaincopyprint?

1. FROM t1

2.

3. INSERT OVERWRITE TABLE t2

4. SELECT t3.c2, count(1)

5. FROM t3

6. WHERE t3.c1 <= 20

7. GROUP BY t3.c2

8.

9. INSERT OVERWRITE DIRECTORY '/output_dir'

10. SELECT t3.c2, avg(t3.c1)

11. FROM t3

12. WHERE t3.c1 > 20 AND t3.c1 <= 30

13. GROUP BY t3.c2

14.

15. INSERT OVERWRITE LOCAL DIRECTORY '/home/dir'

16. SELECT t3.c2, sum(t3.c1)

17. FROM t3

18. WHERE t3.c1 > 30

19. GROUP BY t3.c2;

5. 实际示例

创建一个表

CREATE TABLE u_data (

userid INT,

movieid INT,

rating INT,

unixtime STRING)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '/t'

STORED AS TEXTFILE;

下载示例数据文件,并解压缩

wget https://www.doczj.com/doc/a76896253.html,/system/files/ml-data.tar__0.gz

tar xvzf ml-data.tar__0.gz

加载数据到表中:

LOAD DATA LOCAL INPATH 'ml-data/u.data'

OVERWRITE INTO TABLE u_data;

统计数据总量:

SELECT COUNT(1) FROM u_data;

现在做一些复杂的数据分析:

创建一个weekday_mapper.py: 文件,作为数据按周进行分割

import sys

import datetime

for line in sys.stdin:

line = line.strip()

userid, movieid, rating, unixtime = line.split('/t')

生成数据的周信息

weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday() print '/t'.join([userid, movieid, rating, str(weekday)])

使用映射脚本

//创建表,按分割符分割行中的字段值

CREATE TABLE u_data_new (

userid INT,

movieid INT,

rating INT,

weekday INT)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '/t';

//将python文件加载到系统

add FILE weekday_mapper.py;

将数据按周进行分割

INSERT OVERWRITE TABLE u_data_new

SELECT

TRANSFORM (userid, movieid, rating, unixtime)

USING 'python weekday_mapper.py'

AS (userid, movieid, rating, weekday)

FROM u_data;

SELECT weekday, COUNT(1)

FROM u_data_new

GROUP BY weekday;

处理Apache Weblog 数据

将WEB日志先用正则表达式进行组合,再按需要的条件进行组合输入到表中add jar ../build/contrib/hive_contrib.jar;

CREATE TABLE apachelog (

host STRING,

identity STRING,

user STRING,

time STRING,

request STRING,

status STRING,

size STRING,

referer STRING,

agent STRING)

ROW FORMAT SERDE 'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'

WITH SERDEPROPERTIES (

"input.regex" = "([^ ]*) ([^ ]*) ([^ ]*) (-|//[[^//]]*//]) ([^ /"]*|/"[^/"]*/") (-|[0-9]*) (-|[0-9]*)(?: ([^ /"]*|/"[^/"]*/") ([^ /"]*|/"[^/"]*/"))?",

"output.format.string" = "%1$s %2$s %3$s %4$s %5$s %6$s %7$s %8$s %9$s"

)

STORED AS TEXTFILE;

Hive常用的SQL命令操作

(2012-09-20 17:30:04)

转载▼

标签:

杂谈

分类:Internet和计算机

Hive提供了很多的函数,可以在命令行下show functions罗列所有的函数,你会发现这些函数名与mysql的很相近,绝大多数相同的,可通过describe function functionName 查看函数使用方法。

hive支持的数据类型很简单就INT(4 byte integer),BIGINT(8 byte integer),FLOAT(single precision),DOUBLE(double precision),BOOLEAN,STRING等原子类型,连日期时间类型也不支持,但通过to_date、unix_timestamp、date_diff、date_add、date_sub等函数就能完成mysql 同样的时间日期复杂操作。

如下示例:

select * from tablename where to_date(cz_time) > to_date('2050-12-31');

select * from tablename where unix_timestamp(cz_time) > unix_timestamp('2050-12-31

15:32:28');

分区

hive与mysql分区有些区别,mysql分区是用表结构中的字段来分区(range,list,hash等),而hive不同,他需要手工指定分区列,这个列是独立于表结构,但属于表中一列,在加载数据时手动指定分区。

创建表

hive> CREATE TABLE pokes (foo INT, bar STRING COMMENT 'This is bar');

创建表并创建索引字段ds

hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);

显示所有表

hive> SHOW TABLES;

按正条件(正则表达式)显示表,

hive> SHOW TABLES '.*s';

表添加一列

hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);

添加一列并增加列字段注释

hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');

更改表名

hive> ALTER TABLE events RENAME TO 3koobecaf;

删除列

hive> DROP TABLE pokes;

元数据存储

将本地文件中的数据加载到表中

hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

加载本地数据,同时给定分区信息

hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

加载DFS数据,同时给定分区信息

hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

The above command will load data from an HDFS file/directory to the table. Note that loading data from HDFS will result in moving the file/directory. As a result, the operation is almost instantaneous.

SQL 操作

按先件查询

hive> SELECT a.foo FROM invites a WHERE a.ds='';

将查询数据输出至目录

hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE a.ds='';

将查询结果输出至本地目录

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/local_out' SELECT a.* FROM pokes a;

选择所有列到本地目录

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a;

hive> INSERT OVERWRITE TABLE events SELECT a.* FROM profiles a WHERE a.key < 100;

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/reg_3' SELECT a.* FROM events a;

hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_4' select a.invites, a.pokes FROM profiles a;

hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT COUNT(1) FROM invites a WHERE a.ds='';

hive> INSERT OVERWRITE DIRECTORY '/tmp/reg_5' SELECT a.foo, a.bar FROM invites a;

hive> INSERT OVERWRITE LOCAL DIRECTORY '/tmp/sum' SELECT SUM(a.pc) FROM pc1 a;

将一个表的统计结果插入另一个表中

hive> FROM invites a INSERT OVERWRITE TABLE events SELECT a.bar, count(1) WHERE a.foo > 0 GROUP BY a.bar;

hive> INSERT OVERWRITE TABLE events SELECT a.bar, count(1) FROM invites a WHERE a.foo > 0 GROUP BY a.bar;

JOIN

hive> FROM pokes t1 JOIN invites t2 ON (t1.bar = t2.bar) INSERT OVERWRITE TABLE events SELECT t1.bar, t1.foo, t2.foo;

将多表数据插入到同一表中

FROM src

INSERT OVERWRITE TABLE dest1 SELECT src.* WHERE src.key < 100

INSERT OVERWRITE TABLE dest2 SELECT src.key, src.value WHERE src.key >= 100 and src.key < 200

INSERT OVERWRITE TABLE dest3 PARTITION(ds='2008-04-08', hr='12') SELECT src.key WHERE src.key >= 200 and src.key < 300

INSERT OVERWRITE LOCAL DIRECTORY '/tmp/dest4.out' SELECT src.value WHERE src.key >= 300;

将文件流直接插入文件

hive> FROM invites a INSERT OVERWRITE TABLE events SELECT TRANSFORM(a.foo, a.bar) AS (oof, rab) USING '/bin/cat' WHERE a.ds > '2008-08-09';

This streams the data in the map phase through the script /bin/cat (like hadoop streaming). Similarly - streaming can be used on the reduce side (please see the Hive Tutorial or examples)

实际示例

创建一个表

CREATE TABLE u_data (

userid INT,

movieid INT,

rating INT,

unixtime STRING)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\t'

STORED AS TEXTFILE;

下载示例数据文件,并解压缩

wget https://www.doczj.com/doc/a76896253.html,/system/files/ml-data.tar__0.gz

tar xvzf ml-data.tar__0.gz

加载数据到表中

LOAD DATA LOCAL INPATH 'ml-data/u.data'

OVERWRITE INTO TABLE u_data;

统计数据总量

SELECT COUNT(1) FROM u_data;

现在做一些复杂的数据分析

创建一个weekday_mapper.py: 文件,作为数据按周进行分割

import sys

import datetime

for line in sys.stdin:

line = line.strip()

userid, movieid, rating, unixtime = line.split('\t')

生成数据的周信息

weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday() print '\t'.join([userid, movieid, rating, str(weekday)])

使用映射脚本

//创建表,按分割符分割行中的字段值

CREATE TABLE u_data_new (

userid INT,

movieid INT,

rating INT,

weekday INT)

ROW FORMAT DELIMITED

FIELDS TERMINATED BY '\t';

//将python文件加载到系统

add FILE weekday_mapper.py;

将数据按周进行分割

INSERT OVERWRITE TABLE u_data_new

SELECT

TRANSFORM (userid, movieid, rating, unixtime)

USING 'python weekday_mapper.py'

AS (userid, movieid, rating, weekday)

FROM u_data;

SELECT weekday, COUNT(1)

FROM u_data_new

GROUP BY weekday;

(转)hive sql 学习笔记(1)

一、创建表

在官方的wiki里,example是这样的:

1. CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name

2. [(col_name data_type [COMMENT col_comment], ...)]

3. [COMMENT table_comment]

4. [PARTITIONED BY (col_name data_type

5. [COMMENT col_comment], ...)]

6. [CLUSTERED BY (col_name, col_name, ...)

7. [SORTED BY (col_name [ASC|DESC], ...)]

8. INTO num_buckets BUCKETS]

9. [ROW FORMAT row_format]

10. [STORED AS file_format]

11. [LOCATION hdfs_path]

row_format

: DELIMITED [FIELDS TERMINATED BY char] [COLLECTION ITEMS TERMINATED BY char]

[MAP KEYS TERMINATED BY char]

| SERDE serde_name [WITH SERDEPROPERTIES property_name=property_value,

property_name=property_value, ...]

file_format:

: SEQUENCEFILE

| TEXTFILE

| INPUTFORMAT input_format_classname OUTPUTFORMAT output_format_classname

[ROW FORMAT DELIMITED]关键字,是用来设置创建的表在加载数据的时候,支持的列分隔符;

[STORED AS file_format]关键字是用来设置加载数据的数据类型。Hive本身支持的文件格式只有:Text File,Sequence File。如果文件数据是纯文本,可以使用[STORED AS TEXTFILE]。如果数据需要压缩,使用[STORED AS SEQUENCE] 。通常情况,只要不需要保存序列化的对象,我们默认采用[STORED AS TEXTFILE]。

那么我们创建一张普通的hive表,hive sql就如下:

1. CREATE TABLE test_1(id INT, name STRING, city STRING) SORTED BY TEXTFILE ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’;

其中,hive支持的字段类型,并不多,可以简单的理解为数字类型和字符串类型,详细列表如下:

1. TINYINT

2. SMALLINT

3. INT

4. BIGINT

5. BOOLEAN

6. FLOAT

7. DOUBLE

8. STRING

注意partitioned by 的位置:

create table webdata2(vstart string,vend string,hdid int,userid int,sid int,refsid int,active

int,duration int,mdomain string,sdomain string,refsdomain string,ieid int,refieid string,url string,totaltime int,param2 int,param4 string,param4code string) partitioned by(pid int,daytime string) row format delimited fields terminated by '\t' stored as SEQUENCEFILE;

Hive的表,与普通关系型数据库,如mysql在表上有很大的区别,所有hive的表都是一个文件,它是基于Hadoop的文件系统来做的。

hive总体来说可以总结为三种不同类型的表。

1. 普通表

普通表的创建,如上所说,不讲了。其中,一个表,就对应一个表名对应的文件。

2. 外部表

EXTERNAL 关键字可以让用户创建一个外部表,在建表的同时指定一个指向实际数据的路径(LOCATION),Hive 创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据。具体sql如下:

1. CREATE EXTERNAL TABLE test_1(id INT, name STRING, city STRING) SORTED BY TEXTFILE ROW FORMAT DELIMITED FIELDS TERMINATED BY'\t’LOCATION ‘hdfs://https://www.doczj.com/doc/a76896253.html,/..’3. 分区表

有分区的表可以在创建的时候使用PARTITIONED BY 语句。一个表可以拥有一个或者多个分区,每一个分区单独存在一个目录下。而且,表和分区都可以对某个列进行CLUSTERED BY 操作,将若干个列放入一个桶(bucket)中。也可以利用SORT BY 对数据进行排序。这样可以为特定应用提高性能。具体SQL如下:

1. CREATE TABLE test_1(id INT, name STRING, city STRING) PARTITIONED BY (pt STRING) SORTED BY TEXTFILE ROW FORMAT DELIMITED FIELDS TERMINATED BY‘\t’

Hive的排序,因为底层实现的关系,比较不同于普通排序,这里先不讲。

桶的概念,主要是为性能考虑,可以理解为对分区内列,进行再次划分,提高性能。在底层,一个桶其实是一个文件。如果桶划分过多,会导致文件数量暴增,一旦达到系统文件数量的上限,就杯具了。哪种是最优数量,这个哥也不知道。

分区表实际是一个文件夹,表名即文件夹名。每个分区,实际是表名这个文件夹下面的不同文件。分区可以根据时间、地点等等进行划分。比如,每天一个分区,等于每天存每天的数据;或者每个城市,存放每个城市的数据。每次查询数据的时候,只要写下类似where

pt=2010_08_23这样的条件即可查询指定时间得数据。

总体而言,普通表,类似mysql的表结构,外部表的意义更多是指数据的路径映射。分区表,是最难以理解,也是最hive最大的优势。之后会专门针对分区表进行讲解。

二、加载数据

Hive不支持一条一条的用insert语句进行插入操作,也不支持update的操作。数据是以load

的方式,加载到建立好的表中。数据一旦导入,则不可修改。要么drop掉整个表,要么建立新的表,导入新的数据。

官方指导为:

1. LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]

Hive在数据load这块,大方向分为两种方式,load文件或者查询一张表,或者将某张表里的额查询结果插入指定表。

如果划分更细一点个人归纳总结为4种不同的方式的load:

1. Load data到指定的表

直接将file,加载到指定的表,其中,表可以是普通表或者分区表。具体sql如下:

1. LOAD DATA LOCAL INPATH '/home/admin/test/test.txt' OVERWRITE INTO TABLE test_1

关键字[OVERWRITE]意思是是覆盖原表里的数据,不写则不会覆盖。

关键字[LOCAL]是指你加载文件的来源为本地文件,不写则为hdfs的文件。

其中

‘/home/admin/test/test.txt’为绝对路径

2. load到指定表的分区

直接将file,加载到指定表的指定分区。表本身必须是分区表,如果是普通表,导入会成功,但是数据实际不会被导入。具体sql如下:

1. LOAD DATA LOCAL INPATH '/home/admin/test/test.txt' OVERWRITE INTO TABLE test_1 PARTITION(pt=’xxxx)

load数据,hive支持文件夹的方式,将文件夹内的所有文件,都load到指定表中。Hdfs会将文件系统内的某文件夹路径内的文件,分散到不同的实际物理地址中。这样,在数据量很大的时候,hive支持读取多个文件载入,而不需要限定在唯一的文件中。

3. insert+select

这个是完全不同于文件操作的数据导入方式。官方指导为:

1. Standard syntax:

2. INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)]

select_statement1 FROM from_statement

3.

4. Hive extension (multiple inserts):

5. FROM from_statement

6. INSERT OVERWRITE TABLE tablename1 [PARTITION (partcol1=val1, partcol2=val2 ...)]

select_statement1

7. [INSERT OVERWRITE TABLE tablename2 [PARTITION ...] select_statement2] ...

8.

9. Hive extension (dynamic partition inserts):

10. INSERT OVERWRITE TABLE tablename PARTITION (partcol1[=val1], partcol2[=val2] ...)

select_statement FROM from_statement

这个的用法,和上面两种直接操作file的方式,截然不同。从sql语句本身理解,就是把查询到的数据,直接导入另外一张表。这个暂时不仔细分析,之后查询章节,再细讲。

4. alter 表,对分区操作

在对表结构进行修改的时候,我们可以增加一个新的分区,在增加新分区的同时,将数据直接load到新的分区当中。

1. ALTER TABLE table_name ADD

2. partition_spec [ LOCATION 'location1' ]

3. partition_spec [ LOCATION 'location2' ] ...

Hadoop Hive SQL语法详解

[日期:2012-02-14] 来源:Linux社区作者:hguisu [字体:大中小]

DDL Operations

创建表:

hive> CREATE TABLE pokes (foo INT, bar STRING);

创建表并创建索引字段ds

hive> CREATE TABLE invites (foo INT, bar STRING) PARTITIONED BY (ds STRING);

显示所有表:

hive> SHOW TABLES;

按正条件(正则表达式)显示表,

hive> SHOW TABLES '.*s';

表添加一列:

hive> ALTER TABLE pokes ADD COLUMNS (new_col INT);

添加一列并增加列字段注释

hive> ALTER TABLE invites ADD COLUMNS (new_col2 INT COMMENT 'a comment');

更改表名:

hive> ALTER TABLE events RENAME TO 3koobecaf;

删除列:

hive> DROP TABLE pokes;

元数据存储:

将文件中的数据加载到表中

hive> LOAD DATA LOCAL INPATH './examples/files/kv1.txt' OVERWRITE INTO TABLE pokes;

加载本地数据,同时给定分区信息

hive> LOAD DATA LOCAL INPATH './examples/files/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

加载DFS数据,同时给定分区信息

hive> LOAD DATA INPATH '/user/myname/kv2.txt' OVERWRITE INTO TABLE invites PARTITION (ds='2008-08-15');

The above command will load data from an HDFS file/directory to the table. Note that loading data from HDFS will result in moving the file/directory. As a result, the operation is almost instantaneous.

SQL 操作

按先件查询

hive> SELECT a.foo FROM invites a WHERE a.ds='';

将查询数据输出至目录:

hive> INSERT OVERWRITE DIRECTORY '/tmp/hdfs_out' SELECT a.* FROM invites a WHERE

a.ds='';

实验三 自下而上语法分析及语义分析

实验三自下而上语法分析及语义分析 一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验内容 根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。 对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法 采用LR分析法。 首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。 接下来给出LR分析表。 然后程序的具体实现: ●LR分析表可用二维数组(或其他)实现。 ●添加一个val栈作为语义分析实现的工具。 ●编写总控程序,实现语法分析和语义分析的过程。 注:对于整数的识别可以借助实验1。 五、文法定义 简单的表达式文法如下: E->E+T|E-T|T T->T*F|T/F|F F->(E)|i 上式中,i 为整数。 六、处理程序例 例1: 正确源程序例: 23+(45+4)* 40分析结果应为:正确的表达式。其值为:1983 例2: 错误源程序例: 5+(56+)-24 分析结果应为:错误的表达式:出错位置为)

附录:源程序 #include #include"string.h" #include using namespace std; #define R 30 #define C 20 typedef struct elem { char e[4]; }Elem; //ACTION表与GoTo表中的元素类型 Elem LR[R][C]; //存放ACTION表与GoTo表中的内容 typedef struct out { int order; //序号 int state[10]; //状态栈 char sign[30]; //符号栈 char grasen[20]; //产生式 char input[30]; //输入串 char explen[50]; //解释说明 }OutNode; //输出结果中每一行的类型 OutNode out[20]; //存放输出结果 char Sentence[20]; //存放文法的一个句子 char GramSent[10][20]; //存放文法的一组产生式

大学英语语法结构分析

大学英语第三册语法结构分析 (译部分) 1.发言人明确表示总统在任何情况下都不会取消这次旅行。 The spokesman made it clear that the president would not 主谓语 Cancel (the trip) under any circumstances. 介状 2. 我们相信他所说的,因为他受过良好的教育,出身于受人尊敬的家庭,更重 要的是他为人可靠。 We believ e what he has said , because he is well-educated , comes 主谓主 from a respectable familly and what’s more , he is reliable. 3. 随后后发生的那些事件证明了我的猜疑是对的。 The subsequent events confirmed my suspicions once again. 谓 4. 在赛后举行的记者招待会上,这位足教练因该队表现不佳而向球迷们致歉。 At the press conference held after the game , the football coach apologized to the fans for his team’s poor performance. 5. 令我们吃惊的是,这位常被赞为十分正直的州长竟然是一个贪官。 To our surprise, the governor who had often been praised for his honesty tur ned out to be a corrupt official. 谓语 6. 有少数人得到了提升,在这同时却有数万个人被解雇。 A few workers were promoted , but meanwhile hundreds of workers were dismissed. 7. 如果有机会,约翰也许已成为一位杰出的画家。 Given the chance , John might have become an outstanding painter.

韩礼德与系统功能语法

韩礼德与系统功能语法 韩礼德(M. A. K. Halliday,1925--),英国语言学家。1925年出生于英格兰约克郡里兹,青年时期在英国伦敦大学主修中国语言文学,获得学士学位。1947年至1949年到中国北京大学深造,导师为罗常培先生;1949年至1950为攻读现代汉语转入岭南大学,跟随王力先生学习。回国后,跟随剑桥大学弗思(Firth)教授继续攻读博士学位;1955年完成了对用我国14世纪北方官话译述的《元朝秘史》一文的语言学分析,获得剑桥大学哲学博士学位。毕业后,韩礼德先后在剑桥大学、爱丁堡大学、伦敦大学、美国印第安纳大学、耶鲁大学、布朗大学和肯尼亚内罗毕大学任教。1963年韩礼德担任伦敦大学语言学教授,主持多项对英语研究和教学工作,1973年到1974年担任美国斯坦福大学行为科学高级研究员,1974年到1975年任英国埃克塞斯大学教授,1976年移居澳大利亚筹建悉尼大学语言学系并担任系主任,1987年12月退休。 韩礼德是伦敦学派的主要成员,又是"新弗思派"的领袖。他的学术思想,受弗思和马林诺夫斯基影响很深,在60年代后期,他接受了布拉格学派的"功能句子观"和美国S.拉姆的"语言层次和体系"的理论,进一步发展了他的学说。韩礼德的代表性著作有《语言功能探索》(1973)、《语言的系统和功能》(1976)、《作为社会符号的语言》(1978)和《功能语法导论》(1985/1994/2004)。韩礼德坚持从系统和功能的角度研究语言,批评乔姆斯基的纯形式理论。世界各地围绕着韩礼德已形成了一支系统功能语法学家的队伍,他的理论对我国语法研究的影响也已日渐加深。 从韩礼德对语言学和语言的一些基本观点,我们可以进一步探索贯穿于他的系统功能语法的理论核心,最主要有六点: 1、纯理论功能的( metafunctional )思想 韩礼德认为语言的性质决定人们对语言的要求,即语言所必须完成的功能。尽管这种功能千变万化,我们可以把它们归纳为若干个有限的抽象的功能,这就是“纯理功能”或“元功能”,这是种种语言用途所固有的。纯理论功能包括三方面: (1)语言是对存在于主客观世界的过程和事物的反映,这是“经验”(experiential)功能,或者说关于所说的“内容”的功能。在语言中还有“逻辑”(logical)功能,即以表现为并列关系和从属关系的线性的循环结构的形式出现,由于两者都是建立于说话人对外部世界和内心世界的经验,与其功能相比较是中性的,因而可统称为“概念”(ideational) 功能。 (2)语言是社会人的有意义的活动,是做事的手段,是动作,因此它的功能之一必须是反映人与人间的关系。这个纯理功能称为“人际”(interpersonal) 功能。 (3)实际使用中的语言基本单位不是词或句,而是表达相对的来说是完整思想的“语篇”(text),上述两种功能部分最后要由说话人把它们组织成语篇才能实现。这就是语篇(textual)功能。语篇功能使语言和语境发生联系,是说话人只产生与语境相一致的语篇。 上述三种功能用通俗的话可转述为“观察者”的功能(指说话人对主客观世界的观察)“闯入者”的功能(只向他们灌输自己的思想)和“相关”功能(指语篇的完整性、一致性、衔接性)。韩礼德认为心理语言学可能会强调概念功能,社会语言学会强调人际功能,但他本人坚持这三个纯理功能是三位一体的,不存在主次问题。

英语语法、句式、简单句子结构(透彻分析)

LESSON ONE 句子的三种模式 导言本课的重点是掌握英语的三种基本句型,注意词性和词序,以及定语的位置,同时注意中英文表达上的相同和不相同的地方。三种基本句型虽然简单,但至关重要。掌握好它们,在今后的学习中有一通百通之效。 ▲主+系动词+表 注:*注意该结构中的名词,它们能被定语修饰。 1 这个人是一个老师。The man is a teacher. 主语系表语主语系表语(名词) 2 他(是)很忙。He is busy. 主语系表语主语系表语(形容词) ▲注意中文中的系动词经常被省略,而英文中绝不能省。 3 她(是)在教室里。She is in the classroom.

主语系表语主语系表语(介词短语) ▲定语只修饰名词,不破坏句子的基本结构。通常由形容词和介词短语充当,形容词放在所修饰的名词之前,而介词短语放在所修饰的名词之后,请注意英语与汉语词序的不同。看懂中文的定语是翻译好定语的关键。 介词短语 ---英国法学家波洛克 介词短语 Happiness is a station -----------Pollock, British jurist 形容词介词短语 5 形容词介词短语 man is a teacher 介词短语形容词

6.教室里。 形容词介词短语 The teacher is handsome. My book is 表语(介词短语)定语(介词短语) She is 介词短语即可以做表语也可以做定语,虽然它们词性相同,但由于词序不同,它们所起到的作用也不同,当在is的后面是表语,跟在名词的后面它就起到定语的作用。 课堂练习 1 1是

系统功能语法概述halliday

系统功能语法概述 公元20 世纪,当传统语法威名坠地、逐渐衰落之际,世界的语言学界便迎来了群雄割据的时代…… 把语言看作功能的流派,看重语言环境重要性的流派,把语言看作复杂结构的流派,崇尚寻求语言极致规律的流派……除此之外许多小流派在这之间登场,也在这之间消逝…… 当前,语言学界仍存在着众多流派;在此之中,具有比较大影响力的有: 1. 强调共时、系统性、语言功能的布拉格学派(Prague School) 2. 强调语言环境和语音系统重要性的伦敦学派(London School) 3. 注重描写语言研究结构的美国结构主义(American Structuralism) 4. 寻求人类极致的语言知识的转换生成语法(Transformative-Generative Grammar) 不同的语言学流派的见解不同之处主要集中在句子是怎么组成的,也就是在句法学上面(以后会再说明语言学的不同分支)。而今天将要涉及的,就是以韩礼德(Halliday) 为首的伦敦学派。 20 世纪初,人类学教授马林诺夫斯基(Malinowski) 认为,一个人所在的语言环境(语境)会对一个人怎么使用和理解语言产生很大的作用。例如说,有些词语只能在某一群人里面才有特定的意思,或者说在某个特定的场合才有特定的意思。 马林诺夫斯基这种光辉的思想被语言学家弗斯(Firth) 继承了下来。弗斯把这种光辉思想和现代语言学之父索绪尔(Saussure)的思想结合起来,创立了伦敦学派。而现在,伦敦学派传承到了韩礼德这一代;因为这个学派注重语言环境和语言系统的重要性,因此伦敦学派也被称为系统语言学(systemic linguistics) 和功能语言学(functional linguistics). 韩礼德,人称Halliday, 英格兰约克郡里兹人。对语言很感兴趣,本科阶段在伦敦大学学习汉语语言文学,之后在北京大学深造,接着在岭南大学(中山大学的前身……)攻读现代汉语。此后回国,并在弗斯的指导下继续学习,获得了Ph D. 学位。毕业后,韩礼德在多所大学任教,最后前往澳大利亚悉尼大学创立了语言学系并且担任系主任。1987年韩礼德退休至今。 以上这些只是陈述一些故事而已,不必过于在意的,请继续阅读下面的内容吧。 韩礼德的理论武器一言而蔽之就是系统功能语法(Systemic-Functional Grammar). 这个理论武器,从名字都可以看出,包含两个组成部分: 1. 系统语法(Systemic Grammar), 用来解释语言的内在联系 2. 功能语法(Functional Grammar), 用来说明语言是社会交往的手段 所以接下来我们就分开两部分来解说系统功能语法。 Part I. 系统语法 比较容易看出来,系统语法当中最重要的概念就是系统(system); 不是的话为什么叫做系统语法呢……

系统功能语法

一、系统功能语言学产生的背景 系统功能语言学的形成不是凭空而起的,也不是一朝一夕的,而是有着不可忽视的历史和时代背景,具备了必不可少的条件,并经过了几代人的努力。现分别简述如下:1.英国语言研究的传统 (1)从16世纪开始,对语言的研究在英国蓬勃发展,并被打上了“实用语言学”的烙印。正音学、词典学、速记学、拼法改革以及人造的“哲学语言”等,都反映了英国在语言研究方面的率先发展,也反映了英国语言研究的“实用性”的倾向。 英国对语言研究的传统使现代语言学在英国较早地成为独立的学科,造就了许多杰出的语言学家(如著有《语音学手册》(1877)的施威特(Sweet)、发明了基本元音参照点系统(即元音舌位图)的丹尼尔"琼斯(Danie?Jones)),也为后来的系统功能学派的诞生提供了历史条件。 (2)马林诺夫斯基的语言理论 马林诺夫斯基(Malinowski)以研究土著文化著称,是“人类学功能学派”的创始人。他对语言理论最重要的贡献莫过于强调语言的功能,强调语境研究的重要性。他使用“情景语境”(contextofsituation)探讨语义,认为话语应放在全部的生活方式情景中去理解,话语的意义实质上就是当时当地正在发生的人的活动。 马林诺夫斯基的“情景语境”和“意义是语境中的功能”的思想为语言研究开辟了新的视野,为后来的弗斯“语境学说”(contexturalism)和韩礼德关于语言功能的研究提供了历史的铺垫。 (3)弗斯的语言理论 20世纪40年代初,弗斯成了英国语言学界的中心人物,并创立了“伦敦学派”。弗斯和马林诺夫斯基一样,也认为话语的意义在于它的使用,而意义是情景语境中的复杂关系的总和,所以意义不应局限于词汇和语法意义,还应包括情景语境中的意义。由此,“语境中的功能”(functionincontext)这个提法便构成了弗斯意义理论的核心环节。弗斯的“语境”概念分两种,一种语境来自语言内部,即一个结构各个成分之间的组合关系和一个系统内项目或单位之间的聚合关系;另一种语境来自语言外部,它涉及一个人的全部经历和文化历史,融合了一个人的过去、现在和将来。另外,弗斯受索绪尔语言学说的影响,把语言的聚合关系叫做系统,把组合关系叫做结构,并以这两个概念作为描写和分析语言的基本框架。在弗斯看来,结构是一定的语言成分在组合体中的前后连接,系统是指相关语言项目或语言单位在聚合体中相互类聚。 弗斯的基本语言理论对系统功能语言学产生过直接的影响,系统功能语言学就是在他的理论的基础上发展起来的语法理论。系统功能语言学的创始人韩礼德是弗斯的学生,是伦敦学派的早期成员,他从弗斯那里继承了两个基本思想:第一是“情景语境”,即语言与典型的社会情景有密切的关系;第二是“系统—结构”概念的区分。但是,韩礼德弘扬和发展了弗斯的“语境学说”和关于语言功能的研究,他从社会学的角度研究语言,提出了语言学中的社会符号学(socialsemiotics)。他指出,语言是社会行为,是人的行为潜势(linguisticbehaviorpotential),是语言和文化允许他选择的选择范围,或者说是在语言行为上“能够做的事”的范围。通过语言,“能够做的事”表现为“能够表达的意义”,即意义潜势(meaningpotential)。意义潜势是行为潜势在语言的词汇语法系统上实现的,但语言形式的选择在很大程度上受社会文化环境的制约。关于系统与结构,韩礼德继承了弗斯关于它们的区分,但不同意弗斯结构是第一性的观点。在他的系统功能语法里,语言系统表现为选择关系(即聚合关系),选择是第一性的,结构(即组合关系)是第二性的,是各种选择的结果。换言之,语言系统是一个由可供选择的语义网络,语义是一定语境下的选择,即一个人在特定的环境下使用的语言形式就是在这个系统网络中作出某种选择的结果。

编译原理实验三-自下而上语法分析及语义分析.docx

上海电力学院 编译原理 课程实验报告 实验名称:实验三自下而上语法分析及语义分析 院系:计算机科学和技术学院 专业年级: 学生姓名:学号: 指导老师: 实验日期: 实验三自上而下的语法分析 一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验内容

根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。 对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法 采用LR分析法。 首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。 接下来给出LR分析表。 然后程序的具体实现: ● LR分析表可用二维数组(或其他)实现。 ●添加一个val栈作为语义分析实现的工具。 ●编写总控程序,实现语法分析和语义分析的过程。 注:对于整数的识别可以借助实验1。 五、文法定义 简单的表达式文法如下: (1)E->E+T (2)E->E-T (3)E->T

(4)T->T*F (5)T->T/F (6)T->F (7)F->(E) (8)F->i 状态ACTION(动作)GOTO(转换) i + - * / ( ) # E T F 0 S5 S4 1 2 3 1 S6 S1 2 acc 2 R 3 R3 S7 S13 R3 R3 3 R6 R6 R6 R6 R6 R6 4 S 5 S4 8 2 3 5 R8 R8 R8 R8 R8 R8 6 S5 S4 9 3 7 S5 S4 10 8 S6 R12 S11 9 R1 R1 S7 S13 R1 R1 10 R4 R4 R4 R4 R4 R4 11 R7 R7 R7 R7 R7 R7 12 S5 S4 14 3 13 S5 S4 15 14 R2 R2 S7 S13 R2 R2 15 R5 R5 R5 R5 R5 R5 五、处理程序例和处理结果例 示例1:20133191*(20133191+3191)+ 3191#

英语句子结构分析网站

英语句子结构分析 句子的划分 i. 根据结构划分:①简单句:s+v(主+谓) s+link-v+p(主+谓+表) s+v+o(主+谓+宾) s+v+o+o(主+谓+间宾+直宾) s+v+o+c(主+谓+宾+宾补) ②并列句 and, but, or等 ③复合句:名词从句(宾,主,表,同) 副词从句(状语从句) 形容词从句(定语从句) ii. 根据功能划分:陈述句 疑问句(一般疑问句,特殊疑问句,选择疑问句,反义疑问句,修辞疑问句) 祈使句 感叹句 一.五种句型 1. i am a webaholic.我是一个网虫。 chatting on the internet is interesting. 我喜欢网上聊天。 2. internet dating hurts.网恋有害。 3. i like chatting online.我喜欢网上聊天。 4. chatting on the internet brings me a lot of fun.网上聊天给我带来很多乐趣。 5. we can call internet addicts a webaholic.我们管网上一隐君子叫网虫。 ②保持某种状态:continue, keep, lie, remain, stand, stay. ③看起来,好像:appear, look, seem. ④感官动词:feel, smell, sound, taste. ii. 跟双宾语的动词 1、“七给”(give, pass, lend, write, show, send, hand)和“带”(bring)8个及物动词,在直接宾语前置时,必须在后面加上“to”。即“vt. + sth. + to + sb.” 如:he lent some money to me.类似动词的还有:get,mail,offer,owe(借),pay,promise,read,sell,take,teach等 2、“buy”(买);“draw”(画);“make”(制作)三个动词,在直接宾语前置时,则必须在后边加“for”,构成“vt. + sth. + for + sb.”。 如:mother bought a new dress for me。类似的动词还有:build,choose, cook, cut, do, find, fix,leave,order(订购),reach等。 3、当直接宾语是代词时,间接宾语for和to于直接宾语之后 如:richard made it for him。理查德为他做的这个东西 give it to me。把它给我 4、有些动词后可单独用直接宾语、间接宾语或双宾语,如ask,teach,tell,owe, pay. i asked john. 我问约翰 i asked a question. 我问了一个问题 i asked john a question.我问了约翰一个问题 5、 suggest,explain,introduce,mention,deliver,announce等动词后必须跟介词to, 不能进行直接宾语与间接宾语的转换。

系统功能语法研究

系统功能语法研究 2005级汉语言文字学专业何凯宁学号2005345 内容提要系统功能语法包括“系统语法”和“功能语法”两个部分,但这不是两种语法的简单总和,而是一种完整的语法理论框架的两个不可分割的方面。系统功能语法把语言看做有规律的资源,其基本原理认为语言描写的是系统,更甚于结构。功能语法则说明语言是社会交往的工具。语言系统的形成正是人们在长期交往中为了实现各种不同的语义功能所决定的。 关键词系统功能系统功能语言学特征规律 一系统功能语言学流派代表人物: 系统功能语言学派的早期成员是英国伦敦学派的弗斯培养的一批年青学者,如格莱戈里(M.Gregory)、斯宾塞(J.Spencer)、赫德逊(R.Hudson)、赫德尔斯顿(Huddleston)、韩礼德(Halliday)等。目前比较活跃的有英国的贝利(M.Berry)、伯特勒(C.Butler)、福塞特(R.Fawcett)、特纳(G.Turner)等:在澳大利亚有哈桑(R.Hasan)、麦西逊(C.Matthiessen)、马丁(J.Martin)、奥图尔(L.M.O’Toole)等;在加拿大有格莱戈里(M.Gregory)、班森(J.D.Benson)、格里夫斯(W.S.Greaves)等;在美国有弗里斯(P.Fries)和曼恩(W.C.Mann)等;在中国有胡壮麟、朱永生、张德禄、李战子、严世清等,还有一大批后起之秀。 英国语言学家弗斯(J.R.Firth,又译为弗思,1890-1960)是伦敦学派的鼻祖。英国语言学家刚特·克利斯(Gunther Kress)对弗斯的两条批评意见。第一,弗斯从来没有全面地、系统地阐述过自己的理论,他的论文之间缺乏一种有机的联系,所以人们很难找出其理论模式之间的互相关系。第二,弗斯没有提出一套完整的术语或范畴来使各个层次上的描写联系起来。例如,在论述语境功能时,他没有规定各种语言单位的语境都是什么,它们之间又是如何联系起来等。他的音位理论也缺乏一套系统的术语。 继承和发展弗斯基本理论的是当代著名语言学家韩礼德。他从弗斯那里继承了两条基本原则。第一是“语言环境”(context of situation),认为语言与典型的社会情景有密切联系,并受其影响。韩礼德进一步发展了“语言环境学说”,从社会学角度去研究语言,提出语言学中的社会符号学。第二是“系统”(system)概念,但他重新规定了“系统”的意义,创造了一套完整的范畴。韩礼德避免了弗斯的缺点,把自己的理论概述得清楚明了。他提出了一个完整的理论模式,准确定义了术语的含义及各种关系。正因为这样,韩礼德的系统语言学影响比较大。 系统功能语法包括“系统语法”和“功能语法”两个部分,但这不是两种语法的简单总和,而是一种完整的语法理论框架的两个不可分割的方面。系统功能语法把语言看做有规律的资源,其基本原理认为语言描写的是系统,更甚于结构。系统语法或系统语言学着重说明语言作为系统的内部底层关系,它是与意义相关联的可供人们不断选择的若干个子系统组成的系统网络(system network),又称“意义潜势”(meaning potential)。语言作为符号的一种,在表述说话人想表达的语义时,必然要在语言的各个语义功能部分进行相应的选择。这种选择取决于使用语言时的语境的方方面面。这种选择在语言的不同层次都可以进行。功能语法则说明语言是社会交往的工具。语言系统的形成正是人们在长期交往中为了实现各种不同的语义功能所决定的。同样,当人们在语言系统中进行选择时,也是根据所要实现的功能而进行的有动因的活动。由于语言构建现实,功能语法必须建立在日常形式的语言上,它是经验的理论。 二、研究简史: (一)、20世纪50年代至60年代中期,韩礼德探索并发展了系统语法理论。这主要体现在《语法理论的范畴》、《语言中词类与连锁轴和选择的关系》和《“深层”语法札记》等文章

英语语法英语句子成分分析

英语语法——英语句子成分分析 句子是按照一定的语法规律组成的,表达一个完整的意义。一个句子一般由两部分构成,即主语部分和谓语部分,这两部分也叫做句子的主要成分。句子的次要成分包括宾语,定语,状语,表语等。句子成分是句子中起一定功用的组成部分。 1)主语:是一句的主体,是全句述说的对象,常用名词,数词或代词担任,一般放于句首。如: Students study. (学生学习。) We are friends.(我们是朋友) 这两句话中单词students是个名词,we是代词,它们在句中做主语。 2)谓语:是对主语加以陈述,表示主语的行为或状态,常用动词或者动词词组担任,放在主语的后面。如: Students study. (学生学习。) We are friends. (我们是朋友) 这两句话中单词study和are都是动词,study叫做实意动词,are叫做be动词,它们在句中作谓语。 3)宾语:表示行为的对象,常由名词或者代词担任。放在及物动词或者介词之后。如: They are teachers. ( 他们是老师。) I play with him. (我和他一起玩。) 这两句话中单词teachers是名词,单词him是带词,它们在句中作宾语。 4)定语:是用来说明或者限制名词的成分,常用形容词或者相当于形容词的短语或从句担任。形容词放在名词之前,相当于形容词的短语或从句放在名词的后面。如: This is a red sun.(这是个红太阳.) He is a tall boy.(他是个高个子男孩。) 这两句话中单词red和 tall都是形容词,它们作定语。 5)状语是用来说明动词,形容词,副词或整个句子的成分。常由副词担任。修饰动词时可以放在动词之前,也可以放在动词之后;修饰形容词或副词时放在它们之前。如: The students study hard. (这些学生学习努力。) I often write to him. (我常给他写信。) The bag is too heavy. (这个书包太重了。) 这三句话中单词hard 和often修饰的都是动词,第三句话中单词too修饰的是形容词,它们都作状语。 6)表语:用来说明主语的性质或状态。一般由名词或者形容词担任。如:This table is long. (这个桌子是长的。) 通常情况下,主语和宾语前的成分是定语,谓语前的成分是状语,时间词作状语放在句子后面。句子的成分分布如下:(定语)主语(状语)谓语(定语)宾语(状语) 如:(The tall) boy (often) go (to the big) zoo. (The happy) child --- went (his) home yesterday. 请分析下面句子的结构说出各个成分 1)I have two elder sisters. (我有两个姐姐。) 2) They don't swim very well.(他们游泳不太好。) 3) Do you go to school every day? (你每天去上学吗?) 4) I really want a cup of tea.(我真的想要一杯茶。) 5) Miss Smith teaches English very well.(史密斯先生教英语非常好。) 语法其实并没有一些人想象的那么可怕,其实里面有很多趣味。 第一讲英语句子成分 WARM-UP:1)The teacher in the classroom. 2)Sang many songs and danced happily. 3)She attracts. 4)Many people

系统功能语法概述-Halliday

系统功能语法概述-Halliday

系统功能语法概述 公元20 世纪,当传统语法威名坠地、逐渐衰落之际,世界的语言学界便迎来了群雄割据的时代…… 把语言看作功能的流派,看重语言环境重要性的流派,把语言看作复杂结构的流派,崇尚寻求语言极致规律的流派……除此之外许多小流派在这之间登场,也在这之间消逝…… 当前,语言学界仍存在着众多流派;在此之中,具有比较大影响力的有: 1. 强调共时、系统性、语言功能的布拉格学派(Prague School) 2. 强调语言环境和语音系统重要性的伦敦学派(London School) 3. 注重描写语言研究结构的美国结构主义(American Structuralism) 4. 寻求人类极致的语言知识的转换生成语法(Transformative-Generative Grammar) 不同的语言学流派的见解不同之处主要集中在句子是怎么组成的,也就是在句法学上面(以后会再说明语言学的不同分支)。而今天将要涉及的,就是以韩礼德(Halliday) 为首的伦敦学派。 20 世纪初,人类学教授马林诺夫斯基(Malinowski) 认为,一个人所在的语言环境(语境)会对一个人怎么使用和理解语言产生很大的作用。例如说,有些词语只能在某一群人里面才有特定的意思,或者说在某个特定的场合才有特定的意思。 马林诺夫斯基这种光辉的思想被语言学家弗斯(Firth) 继承了下来。弗斯把这种光辉思想和现代语言学之父索绪尔(Saussure)的思想结合起来,创立了伦敦学派。而现在,伦敦学派传承到了韩礼德这一代;因为这个学派注重语言环境和语言系统的重要性,因此伦敦学派也被称为系统语言学(systemic linguistics) 和功能语言学(functional linguistics). 韩礼德,人称M.A.K. Halliday, 英格兰约克郡里兹人。对语言很感兴趣,本科阶段在伦敦大学学习汉语语言文学,之后在北京大学深造,接着在岭南大学(中山大学的前身……)攻读现代汉语。此后回国,并在弗斯的指导下继续学习,获得了Ph D. 学位。毕业后,韩礼德在多所大学任教,最后前往澳大利亚悉尼大学创立了语言学系并且担任系主任。1987年韩礼德退休至今。 以上这些只是陈述一些故事而已,不必过于在意的,请继续阅读下面的内容吧。 韩礼德的理论武器一言而蔽之就是系统功能语法(Systemic-Functional Grammar). 这个理论武器,从名字都可以看出,包含两个组成部分: 1. 系统语法(Systemic Grammar), 用来解释语言的内在联系 2. 功能语法(Functional Grammar), 用来说明语言是社会交往的手段 所以接下来我们就分开两部分来解说系统功能语法。 Part I. 系统语法

实验三 自下而上语法分析报告及语义分析报告

实验三自下而上语法分析及语义分析一、实验目的: 通过本实验掌握LR分析器的构造过程,并根据语法制导翻译,掌握属性文法的自下而上计算的过程。 二、实验学时: 4学时。 三、实验容 根据给出的简单表达式的语法构成规则(见五),编制LR分析程序,要求能对用给定的语法规则书写的源程序进行语法分析和语义分析。 对于正确的表达式,给出表达式的值。 对于错误的表达式,给出出错位置。 四、实验方法 采用LR分析法。 首先给出S-属性文法的定义(为简便起见,每个文法符号只设置一个综合属性,即该文法符号所代表的表达式的值。属性文法的定义可参照书137页表6.1),并将其改造成用LR分析实现时的语义分析动作(可参照书145页表6.5)。 接下来给出LR分析表。 然后程序的具体实现: ●LR分析表可用二维数组(或其他)实现。 ●添加一个val栈作为语义分析实现的工具。 ●编写总控程序,实现语法分析和语义分析的过程。 注:对于整数的识别可以借助实验1。

五、文法定义 简单的表达式文法如下: E->E+T|E-T|T T->T*F|T/F|F F->(E)|i 上式中,i 为整数。 六、处理程序例 例1: 正确源程序例: 23+(45+4)* 40分析结果应为:正确的表达式。其值为:1983 例2: 错误源程序例: 5+(56+)-24 分析结果应为:错误的表达式:出错位置为)

附录:源程序 #include #include"string.h" #include using namespace std; #define R 30 #define C 20 typedef struct elem { char e[4]; }Elem; //ACTION表与GoTo表中的元素类型 Elem LR[R][C]; //存放ACTION表与GoTo表中的容 typedef struct out { int order; //序号 int state[10]; //状态栈 char sign[30]; //符号栈 char grasen[20]; //产生式

(精心整理)英语语法结构图完整

初中英语语法网络图 一.名词 I. 名词的种类: 专有名词普通名词 国名.地名.人名,团体.机构名称可数名词不可数名词 个体名词集体名词抽象名词物质名词 II. 名词的数: 1. 规则名词的复数形式: 名词的复数形式,一般在单数形式后面加-s或-es。现将构成方法与读音规则列表如下: 规则例词 1一般情况在词尾加-s map-maps, sea-seas, girl-girls, day-days 2以s, x, ch, sh结尾的名词后加-es class-classes, box-boxes, watch-watches, dish-dishes 3 以-f或-fe结尾 的词 变-f和-fe为v再加-es leaf-leaves, thief-thieves, knife-knives, loaf-loaves, wife-wives 加-s belief-beliefs, chief-chiefs, proof-proofs, roof-roofs, gulf-gulfs 4以辅音字母加y结尾的名词,变y为i加 -es party-parties, family-families, story-stories, city-cities 5以元音字母加y结尾的名词,或专有名词 以y结尾的,加-s toy-toys, boy-boys, day-days, ray-rays, Henry-Henrys 6以辅音字母加 -o结尾的名词 一般加-es hero-heroes, Negro-Negroes, potato-potatoes, tomato-tomatoes 不少外来词加-s piano-pianos, photo-photos, auto-autos, kilo-kilos, solo-solos 两者皆可zero-zeros/zeroes, volcano-volcanoes/ volcanos 7以元音字母加-o结尾的名词加-s radio-radios, bamboo-bamboos, zoo-zoos 8以-th结尾的名词加-s truth-truths, mouth-mouths, month-months, path-paths, 2. 不规则名词复数: 英语里有些名词的复数形式是不规则的,现归纳如下:规则例词 1改变名词中的元音字母或其他形式man-men, woman-women, foot-feet, goose-geese, mouse-mice 2单复数相同sheep, deer, series, means, works, fish, species li, yuan, jin, 3只有复数形式ashes, trousers, clothes, thanks, goods, glasses, compasses, contents 4一些集体名词总是用作复数people, police, cattle, staff 5部分集体名词既可以作单数(整体)也 可以作复数(成员) audience, class, family, crowd, couple, group, committee, government, population, crew, team, public, enemy, party 6复数形式表示特别含义customs(海关), forces(军队), times(时代), spirits(情绪), drinks(饮料), sands(沙滩), papers(文件报纸), manners(礼貌), looks(外表), brains(头脑智力), greens(青菜), ruins(废墟)

英语语法成分结构

一、英语语句基本结构分析: >> 主谓宾结构: 主语:可以作主语的成分有名词(如boy),主格代词(如you),动词不定式,动名词等。主语一般在句首。注意名词单数形式常和冠词不分家! 谓语:谓语由动词构成,是英语时态、语态变化的主角,一般在主语之后。不及物动词(vi.)没有宾语,形成主谓结构,如:We come. 宾语:宾语位于及物动词之后,一般同主语构成一样,不同的是构成宾语的代词必须是‘代词宾格’,如:me,him,them等 例:The boy needs a pen.主语the boy,谓语needs(need的第三人称单数形式),宾语a pen. >> 主系表结构: 主语:同‘主谓宾’结构。 联系动词(Link verb):be动词(am,is,are,was,were,have been);其他联系动词如:become成为,turn变成,go 变。其特点是联系动词与其后的表语没有动宾关系,表语多为形容词或副词,既,不可能是宾语。 表语:说明主语的状态、性质、等。可为形容词、副词、名词、代词、不定式、分词。当联系动词不是be,而其后是名词和代词时,多表达‘转变为’之意,注意与动宾关系的区别。 感官动词多可用作联系动词:look well/面色好,sound nice/听起来不错,feel good/感觉好,smell bad/难闻 例:Tom is a boy.(Tom是个男孩)/主语为Tom,系词为be动词的第三人称单数is,表语为a boy >> There be 结构: There be 表示‘存在有’。这里的there没有实际意义,不可与副词‘there那里’混淆。 此结构后跟名词,表示‘(存在)有某事物’ 试比较:There is a boy there.(那儿有一个男孩。)/前一个there无实意,后一个there为副词‘那里’。 二、定语:定语是对名词或代词起修饰、限定作用的词、短语或句子,汉语中常用‘……的’表示。返回 定语通常位于被修饰的成分前。若修饰some,any,every,no构成的复合不定代词时,(如:something、nothing);或不定式、分词短语作定语、从句作定语时,则定语通常置后。副词用作定语时须放在名词之后。 形容词作定语: The little boy needs a blue pen.(little修饰名词boy;blue修饰名词pen.)/小男孩需要一支兰色的钢笔。 Tom is a handsome boy./Tom是个英俊的男孩。 There is a good boy./有个乖男孩。 数词作定语相当于形容词: Two boys need two pens./两个男孩需要两支钢笔。 The two boys are students./这两个男孩是学生。 There are two boys in the room./房间里有两个男孩。 代词或名词所有格作定语: His boy needs Tom's pen./他的男孩需要Tom的钢笔。 His name is Tom./他的名字是汤姆。 There are two boys of Toms there./那儿有Tom家的两个男孩。 介词短语作定语: The boy in the classroom needs a pen of yours./教室里的男孩需要你的一支钢笔。 The boy in blue is Tom./穿兰色衣服的孩子是汤姆。 There are two boys of 9,and three of 10./有两个9岁的,三个10岁的男孩。

系统功能语法概述1

系统功能语法概述 当前,语言学界仍存在着众多流派;在此之中,具有比较大影响力的有: 1. 强调共时、系统性、语言功能的布拉格学派(Prague School) 2. 强调语言环境和语音系统重要性的伦敦学派(London School) 3. 注重描写语言研究结构的美国结构主义(American Structuralism) 4. 寻求人类极致的语言知识的转换生成语法(Transformative-Generative Grammar) 不同的语言学流派的见解不同之处主要集中在句子是怎么组成的,也就是在句法学上面(以后会再说明语言学的不同分支)。而今天将要涉及的,就是以韩礼德(Halliday) 为首的伦敦学派。 20 世纪初,人类学教授马林诺夫斯基(Malinowski) 认为,一个人所在的语言环境(语境)会对一个人怎么使用和理解语言产生很大的作用。例如说,有些词语只能在某一群人里面才有特定的意思,或者说在某个特定的场合才有特定的意思。 马林诺夫斯基这种光辉的思想被语言学家弗斯(Firth) 继承了下来。弗斯把这种光辉思想和现代语言学之父索绪尔(Saussure)的思想结合起来,创立了伦敦学派。而现在,伦敦学派传承到了韩礼德这一代;因为这个学派注重语言环境和语言系统的重要性,因此伦敦学派也被称为系统语言学(systemic linguistics) 和功能语言学(functional linguistics). 韩礼德的理论武器一言而蔽之就是系统功能语法(Systemic-Functional Grammar). 这个理论武器,从名字都可以看出,包含两个组成部分: 1. 系统语法(Systemic Grammar), 用来解释语言的内在联系 2. 功能语法(Functional Grammar), 用来说明语言是社会交往的手段 所以接下来我们就分开两部分来解说系统功能语法。 Part I. 系统语法 系统语法当中最重要的概念就是系统(system); 系统这个东西,其实就是选择。说多一点就是说在语言的语法当中,可以用来选择的一系列选项。举两个很简单的例子: 数的系统:人称的系统: 在数的系统当中,我们要在这个系统当中选择其中一个选项;在人称的系统当中也类似。用一个句子来说就是: He eats the apple. 在这个句子里面,He 遇到了人称的系统,需要在第一第二第三这三个选项当中选择一个;同时它也遇上了数的系统,需要在单数和复数之间选择一个。Eat 根据He 的改变而改变;如果是复数They的时候就要变成了eat 了。而apple 也遇上了数的系统,不过不一定随He 的改变而改变。这样,我们就可以得出系统的几个基本的特征了: 1. 在一个系统里面,选项都是排他的;或者说,选择了一个就不能选其它了。就好像是选择了单数,就不能够选择复数了。 2. 系统的选项是限定的而不是无限的;或者说,一个系统有多少个选项我们是可以列举出来的,就好像数的系统里面有单数和复数两个。 3. 有的情况下,一个系统选项的改变会导致另外一个系统的选项的改变。例如上面那个句子,如果He 从第三人称改为第一人称We 了,eats 也需要改为eat 了。 一个系统当中,左边的叫做入列条件(entry conditions), 例如上面的“人称”;右侧是可选项(options), 例如上面的“第一人称”“第二人称”“第三人称”。系统大概理解这么一些就够了;而系统语法就是围绕系统这个概念的语法。 这个系统语法啊,主要是用来描述功能语法的三个组成部分的。就是说,韩礼德的这两把武器——系统语法和功能语法——的密切关系就在于此了。系统语法是描述功能语法的。 Part II. 功能语法 语言有什么作用什么功能?不同的人,不同的语言学家对此都有相似但不尽一样的见解。韩礼德的

相关主题
文本预览
相关文档 最新文档