• 关于 array_key_exists函数 的搜索结果

问题

PHP的Big-O列表

保持可爱mmm 2020-01-15 16:54:12 1 浏览量 回答数 1

回答

由于似乎没有人做过此事,因此我认为最好在某个地方提供参考。我已经通过基准测试或代码掠过来表征这些array_*功能。我试图将更有趣的Big-O放在顶部。此列表不完整。 注意:假设是哈希查找,所有计算出来的Big-O都是O(1),即使它实际上是O(n)。n的系数是如此之低,在大Big-O的特征开始生效之前,存储足够大的数组的内存开销会伤害您。例如,array_key_exists在N = 1和N = 1,000,000时的通话时间差为〜50%。 有趣的地方: isset/ array_key_exists比in_array和快得多array_search +(联盟)比array_merge(看起来更好)快一点。但是它的工作方式有所不同,因此请记住这一点。 shuffle 在与Big-O相同的层上 array_rand array_pop/ array_push比重新索引罚款更快array_shift/array_unshift 查询: array_key_existsO(n)但实际上接近O(1)-这是由于碰撞中的线性轮询,但是由于碰撞的机会非常小,因此系数也非常小。我发现您将哈希查找视为O(1)来给出更现实的big-O。例如,N = 1000和N = 100000之间的差异仅减慢了50%。 isset( $array[$index] )O(n)但实际上接近O(1)-它使用与array_key_exists相同的查找。由于是语言构造,因此如果密钥是硬编码的,将缓存查找,从而在重复使用同一密钥的情况下加快了查找速度。 in_array O(n)-这是因为它将对数组进行线性搜索,直到找到该值为止。 array_search O(n)-它使用与in_array相同的核心功能,但返回值。 队列功能: array_push O(∑ var_i,对于所有i) array_pop O(1) array_shift O(n)-必须重新索引所有键 array_unshift O(n + ∑ var_i,对于所有i)-必须重新索引所有键 数组相交,并集,减法: array_intersect_key 如果交集100%进行O(Max(param_i_size)* ∑param_i_count,对于所有i),如果交集0%相交O(∑param_i_size,对于所有i) array_intersect 如果交集100%对所有i执行O(n ^ 2 * ∑param_i_count,对于所有i),如果交集0%与O(n ^ 2)相交 array_intersect_assoc 如果交集100%进行O(Max(param_i_size)* ∑param_i_count,对于所有i),如果交集0%相交O(∑param_i_size,对于所有i) array_diff O(πparam_i_size,for all i)-那是所有param_sizes的乘积 array_diff_key O(∑ param_i_size,for i!= 1)-这是因为我们不需要遍历第一个数组。 array_merge O(∑ array_i,i!= 1)-不需要遍历第一个数组 (联合)O(n),其中n是第二个数组的大小(即array_first + array_second)-比array_merge少的开销,因为它不必重新编号 array_replace O(∑ array_i,对于所有i) 随机: shuffle 上) array_rand O(n)-需要线性轮询。 明显的Big-O: array_fill 上) array_fill_keys 上) range 上) array_splice O(偏移量+长度) array_slice O(偏移量+长度)或O(n)如果长度= NULL array_keys 上) array_values 上) array_reverse 上) array_pad O(pad_size) array_flip 上) array_sum 上) array_product 上) array_reduce 上) array_filter 上) array_map 上) array_chunk 上) array_combine 上) 我要感谢Eureqa使得找到函数的Big-O很容易。这是一个了不起的免费程序,可以为任意数据找到最佳拟合函数。 编辑: 对于那些怀疑PHP数组查找是的人O(N),我编写了一个基准测试(O(1)对于大多数实际值它们仍然有效)。 php数组查找图 $tests = 1000000; $max = 5000001; for( $i = 1; $i <= $max; $i += 10000 ) { //create lookup array $array = array_fill( 0, $i, NULL ); //build test indexes $test_indexes = array(); for( $j = 0; $j < $tests; $j++ ) { $test_indexes[] = rand( 0, $i-1 ); } //benchmark array lookups $start = microtime( TRUE ); foreach( $test_indexes as $test_index ) { $value = $array[ $test_index ]; unset( $value ); } $stop = microtime( TRUE ); unset( $array, $test_indexes, $test_index ); printf( "%d,%1.15f\n", $i, $stop - $start ); //time per 1mil lookups unset( $stop, $start ); } 问题来源于stack overflow

保持可爱mmm 2020-01-15 16:54:32 0 浏览量 回答数 0

回答

提交的某字段,一定是_POST、_GET甚至_REQUEST,而不是单纯讨论$var。要防三个情况:1.提交中根本没有这个字段(如果不处理,下标不存在将直接引发运行时错误)2.提交的字段为空3.提交的字段trim()之后为空如果是原生的PHP,我推荐的步骤如下:1.原则是先预处理$_POST。2.把$_POST中所有元素的首尾空格剥了。3.把$_POST中的所有空元素扔了。4.这样,数组中幸存的元素,就都不是空的。判断元素是否存在即可。注意第二和第三步,千万不要傻傻的用foreach自己循环,最好是使用数组函数里的几个遍历函数。代码:$_POST = array_map('trim', $_POST); $_POST = array_filter($_POST); $result = array_key_exists('fieldname', $_POST); if ($result) { // do whatever you wish }这样足够简便了,不过带来的问题是可移植性差(因为需要依赖前边做过的预处理)。如果想要可移植性又好,看着又简单,判断又全面的,自己写函数去吧。

落地花开啦 2019-12-02 02:49:14 0 浏览量 回答数 0

海外云虚拟主机包年25元/月起

海外独享虚拟主机全面上线,助力构建海外网站,提升公司国际形象;全球有效覆盖,超高性价比;建站入门首选,助力出口,适合跨境贸易企业。

回答

你的问题在于对array_search的理解不正确,如果查询存在,它返回的是序号,而不是true或false。因为你查询的刚好是第一位的,所以返回0, 转换成布尔值的时候,就变成false了。如果需要判断值在不在数组中,使用in_array() - 检查数组中是否存在某个值,如果需要判断key,使用array_key_exists() - 检查给定的键名或索引是否存在于数组中参考array_searcharray_search — 在数组中搜索给定的值,如果成功则返回相应的键名关于global,参考变量范围在函数中声明了全局变量 $a 和 $b 之后,对任一变量的所有引用都会指向其全局版本。对于一个函数能够声明的全局变量的最大个数,PHP 没有限制。

小旋风柴进 2019-12-02 02:00:35 0 浏览量 回答数 0

回答

没有好的方法可以将数组存储到单个字段中。 您需要检查您的关系数据并对模式进行适当的更改。请参阅下面的示例以获取对此方法的参考。 如果必须将数组保存到单个字段中,则serialize()and unserialize()函数可以解决问题。但是您不能对实际内容执行查询。 作为序列化功能的替代方法,还有 json_encode()和json_decode()。 考虑以下数组 $a = array( 1 => array( 'a' => 1, 'b' => 2, 'c' => 3 ), 2 => array( 'a' => 1, 'b' => 2, 'c' => 3 ), ); 要将其保存在数据库中,您需要创建一个这样的表 $c = mysql_connect($server, $username, $password); mysql_select_db('test'); $r = mysql_query( 'DROP TABLE IF EXISTS test'); $r = mysql_query( 'CREATE TABLE test ( id INTEGER UNSIGNED NOT NULL, a INTEGER UNSIGNED NOT NULL, b INTEGER UNSIGNED NOT NULL, c INTEGER UNSIGNED NOT NULL, PRIMARY KEY (id) )'); 要使用记录,您可以执行诸如此类的查询(是的,请注意,请注意!) function getTest() { $ret = array(); $c = connect(); $query = 'SELECT * FROM test'; $r = mysql_query($query,$c); while ($o = mysql_fetch_array($r,MYSQL_ASSOC)) { $ret[array_shift($o)] = $o; } mysql_close($c); return $ret; } function putTest($t) { $c = connect(); foreach ($t as $k => $v) { $query = "INSERT INTO test (id,". implode(',',array_keys($v)). ") VALUES ($k,". implode(',',$v). ")"; $r = mysql_query($query,$c); } mysql_close($c); } putTest($a); $b = getTest(); 该connect()函数返回一个mysql连接资源 function connect() { $c = mysql_connect($server, $username, $password); mysql_select_db('test'); return $c; }

保持可爱mmm 2020-02-08 14:17:57 0 浏览量 回答数 0

回答

没有好的方法可以将数组存储到单个字段中。 您需要检查您的关系数据并对模式进行适当的更改。请参阅下面的示例以获取对此方法的参考。 如果必须将数组保存到单个字段中,则serialize()and unserialize()函数可以解决问题。但是您不能对实际内容执行查询。 作为序列化功能的替代方法,还有 json_encode()和json_decode()。 考虑以下数组 $a = array( 1 => array( 'a' => 1, 'b' => 2, 'c' => 3 ), 2 => array( 'a' => 1, 'b' => 2, 'c' => 3 ), ); 要将其保存在数据库中,您需要创建一个这样的表 $c = mysql_connect($server, $username, $password); mysql_select_db('test'); $r = mysql_query( 'DROP TABLE IF EXISTS test'); $r = mysql_query( 'CREATE TABLE test ( id INTEGER UNSIGNED NOT NULL, a INTEGER UNSIGNED NOT NULL, b INTEGER UNSIGNED NOT NULL, c INTEGER UNSIGNED NOT NULL, PRIMARY KEY (id) )'); 要使用记录,您可以执行诸如此类的查询(是的,请注意,请注意!) function getTest() { $ret = array(); $c = connect(); $query = 'SELECT * FROM test'; $r = mysql_query($query,$c); while ($o = mysql_fetch_array($r,MYSQL_ASSOC)) { $ret[array_shift($o)] = $o; } mysql_close($c); return $ret; } function putTest($t) { $c = connect(); foreach ($t as $k => $v) { $query = "INSERT INTO test (id,". implode(',',array_keys($v)). ") VALUES ($k,". implode(',',$v). ")"; $r = mysql_query($query,$c); } mysql_close($c); } putTest($a); $b = getTest(); 该connect()函数返回一个mysql连接资源 function connect() { $c = mysql_connect($server, $username, $password); mysql_select_db('test'); return $c; } 来源:stack overflow

保持可爱mmm 2020-05-13 14:17:03 0 浏览量 回答数 0

问题

PHP利用共享内存构建计数器完成自增数值id生成适用于网页游戏携带区服号的数值id生成:报错

kun坤 2020-06-07 13:32:54 0 浏览量 回答数 1

回答

操作MySQL官方已经不建议使用mysql这个扩展了,这个扩展在PHP7中已经被移除了,请使用mysqli或者pdo_mysql进行替代,比如下面使用mysqli扩展操作MySQL实现CRUD增查改删(在PHP5.4和PHP7上测试通过): <?php function db() { global $app; static $db; //1个请求内多个函数共用1个连接. if ($db) { return $db; } else { $db = @new mysqli( $app['db_host'], $app['db_user'], $app['db_pass'], $app['db_name'], $app['db_port'] ); } if ($db->connect_errno) { echo $db->connect_error; exit(); } $db->set_charset('utf8'); return $db; } function insert($title = '', $content = '') { global $app; $db = db(); $stmt = $db->prepare('INSERT INTO posts (post_title, post_content) VALUES(?, ?)'); $stmt->bind_param('ss', $title, $content); $stmt->execute(); return ($stmt->affected_rows !== 0) ? array(true, 'insert_id' => $stmt->insert_id) : array(false, 'insert_id' => $stmt->insert_id); } function select($id = '') { global $app; $db = db(); if (!empty($id)) { return $db->query('SELECT * FROM posts WHERE id = '.intval($id))->fetch_all(MYSQLI_ASSOC); } else { return $db->query('SELECT * FROM posts')->fetch_all(MYSQLI_ASSOC); } } function select_v2($id = '') { global $app; $db = db(); if (!empty($id)) { $stmt = $db->prepare('SELECT * FROM posts WHERE id = ?'); $stmt->bind_param('i', $id); } else { $stmt = $db->prepare('SELECT * FROM posts'); } $stmt->execute(); //get_result和fetch_all需要mysqlnd支持,PHP从5.4开始内置mysqlnd. return $stmt->get_result()->fetch_all(MYSQLI_ASSOC); } function update($id, $title = '', $content = '') { global $app; $db = db(); $db->autocommit(false); //$db->begin_transaction(); //PHP从5.5开始才有这个函数,之前版本用autocommit即可. $stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?'); $stmt->bind_param('ssi', $title, $content, $id); $stmt->execute(); $db->commit(); //UPDATE时,如果更新的内容跟原来的内容一样,affected_rows也会返回0. return ($stmt->affected_rows !== 0) ? true : false; } function delete($id) { global $app; $db = db(); $db->query('DELETE FROM posts WHERE id = '.intval($id)); return ($db->affected_rows !== 0) ? true : false; } function delete_v2($id) { global $app; $db = db(); $stmt = $db->prepare('DELETE FROM posts WHERE id = ?'); $stmt->bind_param('i', $id); $stmt->execute(); return ($stmt->affected_rows !== 0) ? true : false; } header('Content-Type: text/plain; charset=utf-8'); $app = array( 'db_host' => '127.0.0.1', 'db_user' => 'root', 'db_pass' => 'xxxx', 'db_name' => 'test', 'db_port' => 3306 ); $table = "CREATE TABLE IF NOT EXISTS posts ( id int(10) unsigned NOT NULL AUTO_INCREMENT, post_title varchar(255) NOT NULL DEFAULT '', post_content text NOT NULL DEFAULT '', PRIMARY KEY (id) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;"; //db()->query('DROP TABLE IF EXISTS posts;') or exit(); db()->query($table) or exit(); echo "var_export(insert('标题1', '内容1'));\n"; var_export(insert('标题1', '内容1')); echo "\n\n"; echo "var_export(insert('标题2', '内容2'));\n"; var_export(insert('标题2', '内容2')); echo "\n\n"; echo "var_export(select());\n"; var_export(select()); echo "\n\n"; echo "var_export(update(2, '标题2_更新','内容2_更新'));\n"; var_export(update(2, '标题2_更新','内容2_更新')); echo "\n\n"; echo "var_export(select(2));\n"; var_export(select(2)); echo "\n\n"; echo "var_export(delete(2));\n"; var_export(delete(2)); echo "\n\n"; echo "var_export(select());\n"; var_export(select()); echo "\n\n"; 输出: var_export(insert('标题1', '内容1')); array (   0 => true,   'insert_id' => 1, ) var_export(insert('标题2', '内容2')); array (   0 => true,   'insert_id' => 2, ) var_export(select()); array (   0 =>   array (     'id' => '1',     'post_title' => '标题1',     'post_content' => '内容1',   ),   1 =>   array (     'id' => '2',     'post_title' => '标题2',     'post_content' => '内容2',   ), ) var_export(update(2, '标题2_更新','内容2_更新')); true var_export(select(2)); array (   0 =>   array (     'id' => '2',     'post_title' => '标题2_更新',     'post_content' => '内容2_更新',   ), ) var_export(delete(2)); true var_export(select()); array (   0 =>   array (     'id' => '1',     'post_title' => '标题1',     'post_content' => '内容1',   ), ) ######谢谢!看了一会,看懂一点了。###### composer.json "illuminate/database" : "*" ######这个还不太了解。。。我再百度研究一下。###### 视频教程过期了,, 换一个.. ######您是指视频教程太旧了吗?###### 别被视频毁了,现在是什么年代了,还用mysql函数,用mysqli的我都鄙视。 翻开手册看下pdo ######谢谢,我正在学习。######下面是PDO版本: <?php function db() { global $app; static $db; if ($db) { return $db; } else { try { $dsn = "mysql:dbname=$app[db_name];host=$app[db_host];port=$app[db_port];charset=utf8"; $db = new PDO($dsn, $app['db_user'], $app['db_pass'], array( PDO::ATTR_PERSISTENT => false, PDO::ATTR_EMULATE_PREPARES => false, PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' )); } catch (PDOException $e) { echo $e->getMessage(); exit(); } } return $db; } function insert($title = '', $content = '') { global $app; $db = db(); $stmt = $db->prepare('INSERT INTO posts (post_title, post_content) VALUES(?, ?)'); $stmt->bindParam(1, $title, PDO::PARAM_STR); $stmt->bindParam(2, $content, PDO::PARAM_STR); $stmt->execute(); return ($stmt->rowCount() !== 0) ? array(true, 'lastInsertId' => $db->lastInsertId()) : array(false, 'lastInsertId' => $db->lastInsertId()); } function select($id = '') { global $app; $db = db(); if (!empty($id)) { return $db->query('SELECT * FROM posts WHERE id = '.intval($id))->fetchAll(PDO::FETCH_ASSOC); } else { return $db->query('SELECT * FROM posts')->fetchAll(PDO::FETCH_ASSOC); } } function select_v2($id = '') { global $app; $db = db(); if (!empty($id)) { $stmt = $db->prepare('SELECT * FROM posts WHERE id = ?'); $stmt->bindParam(1, $id, PDO::PARAM_INT); } else { $stmt = $db->prepare('SELECT * FROM posts'); } $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC); } function update($id, $title = '', $content = '') { global $app; $db = db(); $db->setAttribute(PDO::ATTR_AUTOCOMMIT, false); $db->beginTransaction(); $stmt = $db->prepare('UPDATE posts SET post_title = ?, post_content = ? WHERE id = ?'); $stmt->bindParam(1, $title, PDO::PARAM_STR); $stmt->bindParam(2, $content, PDO::PARAM_STR); $stmt->bindParam(3, $id, PDO::PARAM_INT); $stmt->execute(); $db->commit(); return ($stmt->rowCount() !== 0) ? true : false; } function delete($id) { global $app; $db = db(); return ($db->query('DELETE FROM posts WHERE id = '.intval($id))->rowCount() !== 0) ? true : false; } function delete_v2($id) { global $app; $db = db(); $stmt = $db->prepare('DELETE FROM posts WHERE id = ?'); $stmt->bindParam(1, $id, PDO::PARAM_INT); $stmt->execute(); return ($stmt->rowCount() !== 0) ? true : false; } header('Content-Type: text/plain; charset=utf-8'); $app = array( 'db_host' => '127.0.0.1', 'db_user' => 'root', 'db_pass' => 'xxxx', 'db_name' => 'test', 'db_port' => 3306 ); $table = "CREATE TABLE IF NOT EXISTS posts ( id int(10) unsigned NOT NULL AUTO_INCREMENT, post_title varchar(255) NOT NULL DEFAULT '', post_content text NOT NULL DEFAULT '', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;"; //db()->query('DROP TABLE IF EXISTS posts;') or exit(); db()->query($table) or exit(); echo "var_export(insert('标题1', '内容1'));\n"; var_export(insert('标题1', '内容1')); echo "\n\n"; echo "var_export(insert('标题2', '内容2'));\n"; var_export(insert('标题2', '内容2')); echo "\n\n"; echo "var_export(select());\n"; var_export(select_v2()); echo "\n\n"; echo "var_export(update(2, '标题2_更新','内容2_更新'));\n"; var_export(update(2, '标题2_更新','内容2_更新')); echo "\n\n"; echo "var_export(select(2));\n"; var_export(select_v2(2)); echo "\n\n"; echo "var_export(delete(2));\n"; var_export(delete_v2(2)); echo "\n\n"; echo "var_export(select());\n"; var_export(select_v2()); echo "\n\n";

爱吃鱼的程序员 2020-06-01 11:21:14 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 功能简介 您可以通过客户端提供的Tunnel命令实现原有Dship工具的功能。 Tunnel命令主要用于数据的上传和下载等功能。 Upload:支持文件或目录(指一级目录)的上传,每一次上传只支持数据上传到一张表或表的一个分区,有分区的表一定要指定上传的分区,多级分区一定要指定到末级分区。tunnel upload log.txt test_project.test_table/p1="b1",p2="b2"; -- 将log.txt中的数据上传至项目空间test_project的表test_table(二级分区表)中的p1="b1",p2="b2"分区 tunnel upload log.txt test_table --scan=only; -- 将log.txt中的数据上传至表 test_table 中。--scan参数表示需要扫描log.txt中的数据是否符合 test_table 的定义,如果不符合报错,并停止上传数据。 Download:只支持下载到单个文件,每一次下载只支持下载一张表或一个分区到一个文件,有分区的表一定要指定下载的分区,多级分区一定要指定到末级分区。tunnel download test_project.test_table/p1="b1",p2="b2" test_table.txt; -- 将test_project.test_table表(二级分区表)中的数据下载到 test_table.txt 文件中 Resume:因为网络或tunnel服务的原因出错,支持文件或目录的续传。可以继续上一次的数据上传操作,但Resume命令暂时没有对下载操作的支持。tunnel resume; Show:显示历史任务信息。tunnel show history -n 5; --显示前5次上传/下载数据的详细命令 tunnel show log; --显示最后一次上传/下载数据的日志 Purge:清理session目录,默认清理3天内的。tunnel purge 5; --清理前5天的日志 Tunnel上传下载限制 Tunnel命令不支持上传下载Array、Map和Struct类型的数据。 每个Tunnel的Session 在服务端的生命周期为 24 小时,创建后 24 小时内均可使用,也可以跨进程/线程共享使用,但是必须保证同一个 BlockId 没有重复使用。 Tunnel命令使用说明 Tunnel命令支持在客户端通过help子命令获取帮助信息,每个命令和选择支持短命令格式。 odps@ project_name>tunnel help; Usage: tunnel <subcommand> [options] [args] Type 'tunnel help <subcommand>' for help on a specific subcommand. Available subcommands: upload (u) download (d) resume (r) show (s) purge (p) help (h) tunnel is a command for uploading data to / downloading data from ODPS. 参数说明: upload:上传数据到MaxCompute的表中。 download:从MaxCompute的表中下载数据。 resume:如果上传数据失败,通过resume命令进行断点续传,目前仅支持上传数据的续传。每次上传、下载数据被称为一个session。在resume命令后指定session id完成续传。 show:查看历史运行信息。 purge:清理session目录。 help:输出tunnel帮助信息。 Upload 将本地文件的数据导入MaxCompute的表中,以追加模式导入。子命令使用提示: odps@ project_name>tunnel help upload; usage: tunnel upload [options] <path> <[project.]table[/partition]> upload data from local file -acp,-auto-create-partition <ARG> auto create target partition if not exists, default false -bs,-block-size <ARG> block size in MiB, default 100 -c,-charset <ARG> specify file charset, default ignore. set ignore to download raw data -cp,-compress <ARG> compress, default true -dbr,-discard-bad-records <ARG> specify discard bad records action(true|false), default false -dfp,-date-format-pattern <ARG> specify date format pattern, default yyyy-MM-dd HH:mm:ss; -fd,-field-delimiter <ARG> specify field delimiter, support unicode, eg \u0001. default "," -h,-header <ARG> if local file should have table header, default false -mbr,-max-bad-records <ARG> max bad records, default 1000 -ni,-null-indicator <ARG> specify null indicator string, default ""(empty string) -rd,-record-delimiter <ARG> specify record delimiter, support unicode, eg \u0001. default "\r\n" -s,-scan <ARG> specify scan file action(true|false|only), default true -sd,-session-dir <ARG> set session dir, default D:\software\odpscmd_public\plugins\ds hip -ss,-strict-schema <ARG> specify strict schema mode. If false, extra data will be abandoned and insufficient field will be filled with null. Default true -te,-tunnel_endpoint <ARG> tunnel endpoint -threads <ARG> number of threads, default 1 -tz,-time-zone <ARG> time zone, default local timezone: Asia/Shanghai Example: tunnel upload log.txt test_project.test_table/p1="b1",p2="b2" 参数说明: -acp:如果不存在,自动创建目标分区,默认关闭。 -bs:每次上传至Tunnel的数据块大小,默认100MiB(1MiB=1024*1024B)。 -c:指定本地数据文件编码,默认为UTF-8。不设定,默认下载源数据。 -cp:指定是否在本地压缩后再上传,减少网络流量,默认开启。 -dbr:是否忽略脏数据(多列、少列、列数据类型不匹配等情况)。 值为true时,将全部不符合表定义的数据忽略。 值为false时,若遇到脏数据,则给出错误提示信息,目标表内的原始数据不会被污染。 -dfp:DateTime类型数据格式,默认为yyyy-MM-dd HH:mm:ss。如果您想指定时间格式到毫秒级别,可以使用tunnel upload -dfp 'yyyy-MM-dd HH:mm:ss.SSS',有关DateTime数据类型的详情请参见数据类型。 -fd:本地数据文件的列分割符,默认为逗号。 -h:数据文件是否包括表头,如果为true,则dship会跳过表头从第二行开始上传数据。 -mbr:默认情况下,当上传的脏数据超过1000条时,上传动作终止。通过此参数,可以调整可容忍的脏数据量。 -ni:NULL数据标志符,默认为“ ”(空字符串)。 -rd:本地数据文件的行分割符,默认为\r\n。 -s:是否扫描本地数据文件,默认值为false。 值为true时,先扫描数据,若数据格式正确,再导入数据。 值为false时,不扫描数据,直接进行数据导入。 值为only时,仅进行扫描本地数据,扫描结束后不继续导入数据。 -sd:设置session目录。 -te:指定tunnel的Endpoint。 -threads:指定threads的数量,默认为1。 -tz:指定时区。默认为本地时区:Asia/Shanghai。 示例如下: 创建目标表,如下所示: CREATE TABLE IF NOT EXISTS sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) PARTITIONED BY (sale_date STRING,region STRING); 添加分区,如下所示:alter table sale_detail add partition (sale_date='201312', region='hangzhou'); 准备数据文件data.txt,其内容如下所示:shopx,x_id,100 shopy,y_id,200 shopz,z_id这份文件的第三行数据与sale_detail的表定义不符。sale_detail定义了三列,但数据只有两列。 导入数据,如下所示:odps@ project_name>tunnel u d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false Upload session: 20150610xxxxxxxxxxx70a002ec60c Start upload:d:\data.txt Total bytes:41 Split input to 1 blocks 2015-06-10 16:39:22 upload block: '1' ERROR: column mismatch -,expected 3 columns, 2 columns found, please check data or delimiter由于data.txt中有脏数据,数据导入失败。并给出session id及错误提示信息。 数据验证,如下所示:odps@ odpstest_ay52c_ay52> select * from sale_detail where sale_date='201312'; ID = 20150610xxxxxxxxxxxvc61z5 +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ +-----------+-------------+-------------+-----------+--------+由于有脏数据,数据导入失败,表中无数据。 Show 显示历史记录。子命令使用提示: odps@ project_name>tunnel help show; usage: tunnel show history [options] show session information -n,-number <ARG> lines Example: tunnel show history -n 5 tunnel show log 参数说明: -n:指定显示行数。 示例如下: odps@ project_name>tunnel show history; 20150610xxxxxxxxxxx70a002ec60c failed 'u --config-file /D:/console/conf/odps_config.ini --project odpstest_ay52c_ay52 --endpoint http://service.odps.aliyun.com/api --id UlxxxxxxxxxxxrI1 --key 2m4r3WvTxxxxxxxxxx0InVke7UkvR d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false' 说明 20150610xxxxxxxxxxx70a002ec60c是上节中导入数据失败时的运行ID。 Resume 修复执行历史记录,仅对上传数据有效。子命令使用提示: odps@ project_name>tunnel help resume; usage: tunnel resume [session_id] [-force] resume an upload session -f,-force force resume Example: tunnel resume 示例如下: 修改data.txt文件为如下内容: shop9,97,100 shop10,10,200 修复执行上传数据,如下所示: odps@ project_name>tunnel resume 20150610xxxxxxxxxxx70a002ec60c --force; start resume 20150610xxxxxxxxxxx70a002ec60c Upload session: 20150610xxxxxxxxxxx70a002ec60c Start upload:d:\data.txt Resume 1 blocks 2015-06-10 16:46:42 upload block: '1' 2015-06-10 16:46:42 upload block complete, blockid=1 upload complete, average speed is 0 KB/s OK 说明 20150610xxxxxxxxxxx70a002ec60c为上传失败的session ID。 数据验证,如下所示: odps@ project_name>select * from sale_detail where sale_date='201312'; ID = 20150610xxxxxxxxxxxa741z5 +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ | shopx | x_id | 100.0 | 201312 | hangzhou| | shopy | y_id | 200.0 | 201312 | hangzhou| +-----------+-------------+-------------+-----------+--------+ Download 子命令使用提示: odps@ project_name>tunnel help download; usage:tunnel download [options] <[project.]table[/partition]> <path> download data to local file -c,-charset <ARG> specify file charset, default ignore. set ignore to download raw data -ci,-columns-index <ARG> specify the columns index(starts from 0) to download, use comma to split each index -cn,-columns-name <ARG> specify the columns name to download, use comma to split each name -cp,-compress <ARG> compress, default true -dfp,-date-format-pattern <ARG> specify date format pattern, default yyyy-MM-dd HH:mm:ss -e,-exponential <ARG> When download double values, use exponential express if necessary. Otherwise at most 20 digits will be reserved. Default false -fd,-field-delimiter <ARG> specify field delimiter, support unicode, eg \u0001. default "," -h,-header <ARG> if local file should have table header, default false -limit <ARG> specify the number of records to download -ni,-null-indicator <ARG> specify null indicator string, default ""(empty string) -rd,-record-delimiter <ARG> specify record delimiter, support unicode, eg \u0001. default "\r\n" -sd,-session-dir <ARG> set session dir, default D:\software\odpscmd_public\plugins\dshi p -te,-tunnel_endpoint <ARG> tunnel endpoint -threads <ARG> number of threads, default 1 -tz,-time-zone <ARG> time zone, default local timezone: Asia/Shanghai usage: tunnel download [options] instance://<[project/]instance_id> <path> download instance result to local file -c,-charset <ARG> specify file charset, default ignore. set ignore to download raw data -ci,-columns-index <ARG> specify the columns index(starts from 0) to download, use comma to split each index -cn,-columns-name <ARG> specify the columns name to download, use comma to split each name -cp,-compress <ARG> compress, default true -dfp,-date-format-pattern <ARG> specify date format pattern, default yyyy-MM-dd HH:mm:ss -e,-exponential <ARG> When download double values, use exponential express if necessary. Otherwise at most 20 digits will be reserved. Default false -fd,-field-delimiter <ARG> specify field delimiter, support unicode, eg \u0001. default "," -h,-header <ARG> if local file should have table header, default false -limit <ARG> specify the number of records to download -ni,-null-indicator <ARG> specify null indicator string, default ""(empty string) -rd,-record-delimiter <ARG> specify record delimiter, support unicode, eg \u0001. default "\r\n" -sd,-session-dir <ARG> set session dir, default D:\software\odpscmd_public\plugins\dshi p -te,-tunnel_endpoint <ARG> tunnel endpoint -threads <ARG> number of threads, default 1 -tz,-time-zone <ARG> time zone, default local timezone: Asia/Shanghai Example: tunnel download test_project.test_table/p1="b1",p2="b2" log.txt tunnel download instance://test_project/test_instance log.txt 参数说明: -c:本地数据文件编码,默认为UTF-8。 -ci:指定列索引(从0)下载,使用逗号分隔。 -cn:指定要下载的列名称,使用逗号分隔每个名称。 -cp,-compress:指定是否压缩后再下载,减少网络流量,默认开启。 -dfp:DateTime类型数据格式,默认为yyyy-MM-dd HH:mm:ss。 -e:当下载double值时,如果需要,使用指数函数表示,否则最多保留20位。 -fd:本地数据文件的列分割符,默认为逗号。 -h:数据文件是否包括表头,如果为true,则dship会跳过表头从第二行开始下载数据。 说明 -h=true和threads>1即多线程不能一起使用。 -limit:指定要下载的文件数量。 -ni:NULL数据标志符,默认为“ ”(空字符串)。 -rd:本地数据文件的行分割符,默认为\r\n。 -sd:设置session目录。 -te:指定tunnel endpoint。 -threads:指定threads的数量,默认为1。 -tz:指定时区。默认为本地时区:Asia/Shanghai。 示例如下: 下载数据到 result.txt文件中,如下所示: $ ./tunnel download sale_detail/sale_date=201312,region=hangzhou result.txt; Download session: 20150610xxxxxxxxxxx70a002ed0b9 Total records: 2 2015-06-10 16:58:24 download records: 2 2015-06-10 16:58:24 file size: 30 bytes OK 验证 result.txt的文件内容,如下所示: shopx,x_id,100.0 shopy,y_id,200.0 Purge 清除session目录,默认清除距离当前日期3天内的。子命令使用提示: odps@ project_name>tunnel help purge; usage: tunnel purge [n] force session history to be purged.([n] days before, default 3 days) Example: tunnel purge 5 数据类型说明: 类型 描述 STRING 字符串类型,长度不能超过8MB。 BOOLEN 上传值只支持true、false、0和1。下载值为true/false且不区分大小写。 BIGINT 取值范围[-9223372036854775807,9223372036854775807]。 DOUBLE 有效位数16位 上传支持科学计数法表示 下载仅使用数字表示 最大值:1.7976931348623157E308 最小值:4.9E-324 无穷大:Infinity 无穷小:-Infinity DATETIME Datetime类型默认支持时区为GMT+8的数据上传,可以通过命令行指定用户数据日期格式的format pattern。 如果您上传DATETIME类型的数据,需要指定时间日期格式,具体格式请参见SimpleDateFormat。 "yyyyMMddHHmmss": 数据格式"20140209101000" "yyyy-MM-dd HH:mm:ss"(默认):数据格式"2014-02-09 10:10:00" "yyyy年MM月dd日": 数据格式"2014年09月01日" 示例如下: tunnel upload log.txt test_table -dfp "yyyy-MM-dd HH:mm:ss" 空值:所有数据类型都可以有空值。 默认空字符串为空值。 可在命令行下通过-null-indicator参数来指定空值的字符串。 tunnel upload log.txt test_table -ni "NULL" 字符编码:您可以指定文件的字符编码,默认为UTF-8。 tunnel upload log.txt test_table -c "gbk" 分隔符:tunnel命令支持您自定义的文件分隔符,行分隔符选项为-record-delimiter,列分隔符选项为-field-delimiter。 分隔符说明如下: 支持多个字符的行列分隔符。 列分隔符不能够包含行分隔符。 转义字符分隔符,在命令行方式下只支持\r、\n和\t。 示例如下: tunnel upload log.txt test_table -fd "||" -rd "\r\n"

2019-12-01 23:10:57 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 功能简介 您可以通过客户端提供的Tunnel命令实现原有Dship工具的功能。 Tunnel命令主要用于数据的上传和下载等功能。 Upload:支持文件或目录(指一级目录)的上传,每一次上传只支持数据上传到一张表或表的一个分区,有分区的表一定要指定上传的分区,多级分区一定要指定到末级分区。tunnel upload log.txt test_project.test_table/p1="b1",p2="b2"; -- 将log.txt中的数据上传至项目空间test_project的表test_table(二级分区表)中的p1="b1",p2="b2"分区 tunnel upload log.txt test_table --scan=only; -- 将log.txt中的数据上传至表 test_table 中。--scan参数表示需要扫描log.txt中的数据是否符合 test_table 的定义,如果不符合报错,并停止上传数据。 Download:只支持下载到单个文件,每一次下载只支持下载一张表或一个分区到一个文件,有分区的表一定要指定下载的分区,多级分区一定要指定到末级分区。tunnel download test_project.test_table/p1="b1",p2="b2" test_table.txt; -- 将test_project.test_table表(二级分区表)中的数据下载到 test_table.txt 文件中 Resume:因为网络或tunnel服务的原因出错,支持文件或目录的续传。可以继续上一次的数据上传操作,但Resume命令暂时没有对下载操作的支持。tunnel resume; Show:显示历史任务信息。tunnel show history -n 5; --显示前5次上传/下载数据的详细命令 tunnel show log; --显示最后一次上传/下载数据的日志 Purge:清理session目录,默认清理3天内的。tunnel purge 5; --清理前5天的日志 Tunnel上传下载限制 Tunnel命令不支持上传下载Array、Map和Struct类型的数据。 每个Tunnel的Session 在服务端的生命周期为 24 小时,创建后 24 小时内均可使用,也可以跨进程/线程共享使用,但是必须保证同一个 BlockId 没有重复使用。 Tunnel命令使用说明 Tunnel命令支持在客户端通过help子命令获取帮助信息,每个命令和选择支持短命令格式。 odps@ project_name>tunnel help; Usage: tunnel <subcommand> [options] [args] Type 'tunnel help <subcommand>' for help on a specific subcommand. Available subcommands: upload (u) download (d) resume (r) show (s) purge (p) help (h) tunnel is a command for uploading data to / downloading data from ODPS. 参数说明: upload:上传数据到MaxCompute的表中。 download:从MaxCompute的表中下载数据。 resume:如果上传数据失败,通过resume命令进行断点续传,目前仅支持上传数据的续传。每次上传、下载数据被称为一个session。在resume命令后指定session id完成续传。 show:查看历史运行信息。 purge:清理session目录。 help:输出tunnel帮助信息。 Upload 将本地文件的数据导入MaxCompute的表中,以追加模式导入。子命令使用提示: odps@ project_name>tunnel help upload; usage: tunnel upload [options] <path> <[project.]table[/partition]> upload data from local file -acp,-auto-create-partition <ARG> auto create target partition if not exists, default false -bs,-block-size <ARG> block size in MiB, default 100 -c,-charset <ARG> specify file charset, default ignore. set ignore to download raw data -cp,-compress <ARG> compress, default true -dbr,-discard-bad-records <ARG> specify discard bad records action(true|false), default false -dfp,-date-format-pattern <ARG> specify date format pattern, default yyyy-MM-dd HH:mm:ss; -fd,-field-delimiter <ARG> specify field delimiter, support unicode, eg \u0001. default "," -h,-header <ARG> if local file should have table header, default false -mbr,-max-bad-records <ARG> max bad records, default 1000 -ni,-null-indicator <ARG> specify null indicator string, default ""(empty string) -rd,-record-delimiter <ARG> specify record delimiter, support unicode, eg \u0001. default "\r\n" -s,-scan <ARG> specify scan file action(true|false|only), default true -sd,-session-dir <ARG> set session dir, default D:\software\odpscmd_public\plugins\ds hip -ss,-strict-schema <ARG> specify strict schema mode. If false, extra data will be abandoned and insufficient field will be filled with null. Default true -te,-tunnel_endpoint <ARG> tunnel endpoint -threads <ARG> number of threads, default 1 -tz,-time-zone <ARG> time zone, default local timezone: Asia/Shanghai Example: tunnel upload log.txt test_project.test_table/p1="b1",p2="b2" 参数说明: -acp:如果不存在,自动创建目标分区,默认关闭。 -bs:每次上传至Tunnel的数据块大小,默认100MiB(1MiB=1024*1024B)。 -c:指定本地数据文件编码,默认为UTF-8。不设定,默认下载源数据。 -cp:指定是否在本地压缩后再上传,减少网络流量,默认开启。 -dbr:是否忽略脏数据(多列、少列、列数据类型不匹配等情况)。 值为true时,将全部不符合表定义的数据忽略。 值为false时,若遇到脏数据,则给出错误提示信息,目标表内的原始数据不会被污染。 -dfp:DateTime类型数据格式,默认为yyyy-MM-dd HH:mm:ss。如果您想指定时间格式到毫秒级别,可以使用tunnel upload -dfp 'yyyy-MM-dd HH:mm:ss.SSS',有关DateTime数据类型的详情请参见数据类型。 -fd:本地数据文件的列分割符,默认为逗号。 -h:数据文件是否包括表头,如果为true,则dship会跳过表头从第二行开始上传数据。 -mbr:默认情况下,当上传的脏数据超过1000条时,上传动作终止。通过此参数,可以调整可容忍的脏数据量。 -ni:NULL数据标志符,默认为“ ”(空字符串)。 -rd:本地数据文件的行分割符,默认为\r\n。 -s:是否扫描本地数据文件,默认值为false。 值为true时,先扫描数据,若数据格式正确,再导入数据。 值为false时,不扫描数据,直接进行数据导入。 值为only时,仅进行扫描本地数据,扫描结束后不继续导入数据。 -sd:设置session目录。 -te:指定tunnel的Endpoint。 -threads:指定threads的数量,默认为1。 -tz:指定时区。默认为本地时区:Asia/Shanghai。 示例如下: 创建目标表,如下所示: CREATE TABLE IF NOT EXISTS sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) PARTITIONED BY (sale_date STRING,region STRING); 添加分区,如下所示:alter table sale_detail add partition (sale_date='201312', region='hangzhou'); 准备数据文件data.txt,其内容如下所示:shopx,x_id,100 shopy,y_id,200 shopz,z_id这份文件的第三行数据与sale_detail的表定义不符。sale_detail定义了三列,但数据只有两列。 导入数据,如下所示:odps@ project_name>tunnel u d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false Upload session: 20150610xxxxxxxxxxx70a002ec60c Start upload:d:\data.txt Total bytes:41 Split input to 1 blocks 2015-06-10 16:39:22 upload block: '1' ERROR: column mismatch -,expected 3 columns, 2 columns found, please check data or delimiter由于data.txt中有脏数据,数据导入失败。并给出session id及错误提示信息。 数据验证,如下所示:odps@ odpstest_ay52c_ay52> select * from sale_detail where sale_date='201312'; ID = 20150610xxxxxxxxxxxvc61z5 +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ +-----------+-------------+-------------+-----------+--------+由于有脏数据,数据导入失败,表中无数据。 Show 显示历史记录。子命令使用提示: odps@ project_name>tunnel help show; usage: tunnel show history [options] show session information -n,-number <ARG> lines Example: tunnel show history -n 5 tunnel show log 参数说明: -n:指定显示行数。 示例如下: odps@ project_name>tunnel show history; 20150610xxxxxxxxxxx70a002ec60c failed 'u --config-file /D:/console/conf/odps_config.ini --project odpstest_ay52c_ay52 --endpoint http://service.odps.aliyun.com/api --id UlxxxxxxxxxxxrI1 --key 2m4r3WvTxxxxxxxxxx0InVke7UkvR d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false' 说明 20150610xxxxxxxxxxx70a002ec60c是上节中导入数据失败时的运行ID。 Resume 修复执行历史记录,仅对上传数据有效。子命令使用提示: odps@ project_name>tunnel help resume; usage: tunnel resume [session_id] [-force] resume an upload session -f,-force force resume Example: tunnel resume 示例如下: 修改data.txt文件为如下内容: shop9,97,100 shop10,10,200 修复执行上传数据,如下所示: odps@ project_name>tunnel resume 20150610xxxxxxxxxxx70a002ec60c --force; start resume 20150610xxxxxxxxxxx70a002ec60c Upload session: 20150610xxxxxxxxxxx70a002ec60c Start upload:d:\data.txt Resume 1 blocks 2015-06-10 16:46:42 upload block: '1' 2015-06-10 16:46:42 upload block complete, blockid=1 upload complete, average speed is 0 KB/s OK 说明 20150610xxxxxxxxxxx70a002ec60c为上传失败的session ID。 数据验证,如下所示: odps@ project_name>select * from sale_detail where sale_date='201312'; ID = 20150610xxxxxxxxxxxa741z5 +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ | shopx | x_id | 100.0 | 201312 | hangzhou| | shopy | y_id | 200.0 | 201312 | hangzhou| +-----------+-------------+-------------+-----------+--------+ Download 子命令使用提示: odps@ project_name>tunnel help download; usage:tunnel download [options] <[project.]table[/partition]> <path> download data to local file -c,-charset <ARG> specify file charset, default ignore. set ignore to download raw data -ci,-columns-index <ARG> specify the columns index(starts from 0) to download, use comma to split each index -cn,-columns-name <ARG> specify the columns name to download, use comma to split each name -cp,-compress <ARG> compress, default true -dfp,-date-format-pattern <ARG> specify date format pattern, default yyyy-MM-dd HH:mm:ss -e,-exponential <ARG> When download double values, use exponential express if necessary. Otherwise at most 20 digits will be reserved. Default false -fd,-field-delimiter <ARG> specify field delimiter, support unicode, eg \u0001. default "," -h,-header <ARG> if local file should have table header, default false -limit <ARG> specify the number of records to download -ni,-null-indicator <ARG> specify null indicator string, default ""(empty string) -rd,-record-delimiter <ARG> specify record delimiter, support unicode, eg \u0001. default "\r\n" -sd,-session-dir <ARG> set session dir, default D:\software\odpscmd_public\plugins\dshi p -te,-tunnel_endpoint <ARG> tunnel endpoint -threads <ARG> number of threads, default 1 -tz,-time-zone <ARG> time zone, default local timezone: Asia/Shanghai usage: tunnel download [options] instance://<[project/]instance_id> <path> download instance result to local file -c,-charset <ARG> specify file charset, default ignore. set ignore to download raw data -ci,-columns-index <ARG> specify the columns index(starts from 0) to download, use comma to split each index -cn,-columns-name <ARG> specify the columns name to download, use comma to split each name -cp,-compress <ARG> compress, default true -dfp,-date-format-pattern <ARG> specify date format pattern, default yyyy-MM-dd HH:mm:ss -e,-exponential <ARG> When download double values, use exponential express if necessary. Otherwise at most 20 digits will be reserved. Default false -fd,-field-delimiter <ARG> specify field delimiter, support unicode, eg \u0001. default "," -h,-header <ARG> if local file should have table header, default false -limit <ARG> specify the number of records to download -ni,-null-indicator <ARG> specify null indicator string, default ""(empty string) -rd,-record-delimiter <ARG> specify record delimiter, support unicode, eg \u0001. default "\r\n" -sd,-session-dir <ARG> set session dir, default D:\software\odpscmd_public\plugins\dshi p -te,-tunnel_endpoint <ARG> tunnel endpoint -threads <ARG> number of threads, default 1 -tz,-time-zone <ARG> time zone, default local timezone: Asia/Shanghai Example: tunnel download test_project.test_table/p1="b1",p2="b2" log.txt tunnel download instance://test_project/test_instance log.txt 参数说明: -c:本地数据文件编码,默认为UTF-8。 -ci:指定列索引(从0)下载,使用逗号分隔。 -cn:指定要下载的列名称,使用逗号分隔每个名称。 -cp,-compress:指定是否压缩后再下载,减少网络流量,默认开启。 -dfp:DateTime类型数据格式,默认为yyyy-MM-dd HH:mm:ss。 -e:当下载double值时,如果需要,使用指数函数表示,否则最多保留20位。 -fd:本地数据文件的列分割符,默认为逗号。 -h:数据文件是否包括表头,如果为true,则dship会跳过表头从第二行开始下载数据。 说明 -h=true和threads>1即多线程不能一起使用。 -limit:指定要下载的文件数量。 -ni:NULL数据标志符,默认为“ ”(空字符串)。 -rd:本地数据文件的行分割符,默认为\r\n。 -sd:设置session目录。 -te:指定tunnel endpoint。 -threads:指定threads的数量,默认为1。 -tz:指定时区。默认为本地时区:Asia/Shanghai。 示例如下: 下载数据到 result.txt文件中,如下所示: $ ./tunnel download sale_detail/sale_date=201312,region=hangzhou result.txt; Download session: 20150610xxxxxxxxxxx70a002ed0b9 Total records: 2 2015-06-10 16:58:24 download records: 2 2015-06-10 16:58:24 file size: 30 bytes OK 验证 result.txt的文件内容,如下所示: shopx,x_id,100.0 shopy,y_id,200.0 Purge 清除session目录,默认清除距离当前日期3天内的。子命令使用提示: odps@ project_name>tunnel help purge; usage: tunnel purge [n] force session history to be purged.([n] days before, default 3 days) Example: tunnel purge 5 数据类型说明: 类型 描述 STRING 字符串类型,长度不能超过8MB。 BOOLEN 上传值只支持true、false、0和1。下载值为true/false且不区分大小写。 BIGINT 取值范围[-9223372036854775807,9223372036854775807]。 DOUBLE 有效位数16位 上传支持科学计数法表示 下载仅使用数字表示 最大值:1.7976931348623157E308 最小值:4.9E-324 无穷大:Infinity 无穷小:-Infinity DATETIME Datetime类型默认支持时区为GMT+8的数据上传,可以通过命令行指定用户数据日期格式的format pattern。 如果您上传DATETIME类型的数据,需要指定时间日期格式,具体格式请参见SimpleDateFormat。 "yyyyMMddHHmmss": 数据格式"20140209101000" "yyyy-MM-dd HH:mm:ss"(默认):数据格式"2014-02-09 10:10:00" "yyyy年MM月dd日": 数据格式"2014年09月01日" 示例如下: tunnel upload log.txt test_table -dfp "yyyy-MM-dd HH:mm:ss" 空值:所有数据类型都可以有空值。 默认空字符串为空值。 可在命令行下通过-null-indicator参数来指定空值的字符串。 tunnel upload log.txt test_table -ni "NULL" 字符编码:您可以指定文件的字符编码,默认为UTF-8。 tunnel upload log.txt test_table -c "gbk" 分隔符:tunnel命令支持您自定义的文件分隔符,行分隔符选项为-record-delimiter,列分隔符选项为-field-delimiter。 分隔符说明如下: 支持多个字符的行列分隔符。 列分隔符不能够包含行分隔符。 转义字符分隔符,在命令行方式下只支持\r、\n和\t。 示例如下: tunnel upload log.txt test_table -fd "||" -rd "\r\n"

2019-12-01 23:10:56 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 功能简介 您可以通过客户端提供的Tunnel命令实现原有Dship工具的功能。 Tunnel命令主要用于数据的上传和下载等功能。 Upload:支持文件或目录(指一级目录)的上传,每一次上传只支持数据上传到一张表或表的一个分区,有分区的表一定要指定上传的分区,多级分区一定要指定到末级分区。tunnel upload log.txt test_project.test_table/p1="b1",p2="b2"; -- 将log.txt中的数据上传至项目空间test_project的表test_table(二级分区表)中的p1="b1",p2="b2"分区 tunnel upload log.txt test_table --scan=only; -- 将log.txt中的数据上传至表 test_table 中。--scan参数表示需要扫描log.txt中的数据是否符合 test_table 的定义,如果不符合报错,并停止上传数据。 Download:只支持下载到单个文件,每一次下载只支持下载一张表或一个分区到一个文件,有分区的表一定要指定下载的分区,多级分区一定要指定到末级分区。tunnel download test_project.test_table/p1="b1",p2="b2" test_table.txt; -- 将test_project.test_table表(二级分区表)中的数据下载到 test_table.txt 文件中 Resume:因为网络或tunnel服务的原因出错,支持文件或目录的续传。可以继续上一次的数据上传操作,但Resume命令暂时没有对下载操作的支持。tunnel resume; Show:显示历史任务信息。tunnel show history -n 5; --显示前5次上传/下载数据的详细命令 tunnel show log; --显示最后一次上传/下载数据的日志 Purge:清理session目录,默认清理3天内的。tunnel purge 5; --清理前5天的日志 Tunnel上传下载限制 Tunnel命令不支持上传下载Array、Map和Struct类型的数据。 每个Tunnel的Session 在服务端的生命周期为 24 小时,创建后 24 小时内均可使用,也可以跨进程/线程共享使用,但是必须保证同一个 BlockId 没有重复使用。 Tunnel命令使用说明 Tunnel命令支持在客户端通过help子命令获取帮助信息,每个命令和选择支持短命令格式。 odps@ project_name>tunnel help; Usage: tunnel <subcommand> [options] [args] Type 'tunnel help <subcommand>' for help on a specific subcommand. Available subcommands: upload (u) download (d) resume (r) show (s) purge (p) help (h) tunnel is a command for uploading data to / downloading data from ODPS. 参数说明: upload:上传数据到MaxCompute的表中。 download:从MaxCompute的表中下载数据。 resume:如果上传数据失败,通过resume命令进行断点续传,目前仅支持上传数据的续传。每次上传、下载数据被称为一个session。在resume命令后指定session id完成续传。 show:查看历史运行信息。 purge:清理session目录。 help:输出tunnel帮助信息。 Upload 将本地文件的数据导入MaxCompute的表中,以追加模式导入。子命令使用提示: odps@ project_name>tunnel help upload; usage: tunnel upload [options] <path> <[project.]table[/partition]> upload data from local file -acp,-auto-create-partition <ARG> auto create target partition if not exists, default false -bs,-block-size <ARG> block size in MiB, default 100 -c,-charset <ARG> specify file charset, default ignore. set ignore to download raw data -cp,-compress <ARG> compress, default true -dbr,-discard-bad-records <ARG> specify discard bad records action(true|false), default false -dfp,-date-format-pattern <ARG> specify date format pattern, default yyyy-MM-dd HH:mm:ss; -fd,-field-delimiter <ARG> specify field delimiter, support unicode, eg \u0001. default "," -h,-header <ARG> if local file should have table header, default false -mbr,-max-bad-records <ARG> max bad records, default 1000 -ni,-null-indicator <ARG> specify null indicator string, default ""(empty string) -rd,-record-delimiter <ARG> specify record delimiter, support unicode, eg \u0001. default "\r\n" -s,-scan <ARG> specify scan file action(true|false|only), default true -sd,-session-dir <ARG> set session dir, default D:\software\odpscmd_public\plugins\ds hip -ss,-strict-schema <ARG> specify strict schema mode. If false, extra data will be abandoned and insufficient field will be filled with null. Default true -te,-tunnel_endpoint <ARG> tunnel endpoint -threads <ARG> number of threads, default 1 -tz,-time-zone <ARG> time zone, default local timezone: Asia/Shanghai Example: tunnel upload log.txt test_project.test_table/p1="b1",p2="b2" 参数说明: -acp:如果不存在,自动创建目标分区,默认关闭。 -bs:每次上传至Tunnel的数据块大小,默认100MiB(1MiB=1024*1024B)。 -c:指定本地数据文件编码,默认为UTF-8。不设定,默认下载源数据。 -cp:指定是否在本地压缩后再上传,减少网络流量,默认开启。 -dbr:是否忽略脏数据(多列、少列、列数据类型不匹配等情况)。 值为true时,将全部不符合表定义的数据忽略。 值为false时,若遇到脏数据,则给出错误提示信息,目标表内的原始数据不会被污染。 -dfp:DateTime类型数据格式,默认为yyyy-MM-dd HH:mm:ss。如果您想指定时间格式到毫秒级别,可以使用tunnel upload -dfp 'yyyy-MM-dd HH:mm:ss.SSS',有关DateTime数据类型的详情请参见数据类型。 -fd:本地数据文件的列分割符,默认为逗号。 -h:数据文件是否包括表头,如果为true,则dship会跳过表头从第二行开始上传数据。 -mbr:默认情况下,当上传的脏数据超过1000条时,上传动作终止。通过此参数,可以调整可容忍的脏数据量。 -ni:NULL数据标志符,默认为“ ”(空字符串)。 -rd:本地数据文件的行分割符,默认为\r\n。 -s:是否扫描本地数据文件,默认值为false。 值为true时,先扫描数据,若数据格式正确,再导入数据。 值为false时,不扫描数据,直接进行数据导入。 值为only时,仅进行扫描本地数据,扫描结束后不继续导入数据。 -sd:设置session目录。 -te:指定tunnel的Endpoint。 -threads:指定threads的数量,默认为1。 -tz:指定时区。默认为本地时区:Asia/Shanghai。 示例如下: 创建目标表,如下所示: CREATE TABLE IF NOT EXISTS sale_detail( shop_name STRING, customer_id STRING, total_price DOUBLE) PARTITIONED BY (sale_date STRING,region STRING); 添加分区,如下所示:alter table sale_detail add partition (sale_date='201312', region='hangzhou'); 准备数据文件data.txt,其内容如下所示:shopx,x_id,100 shopy,y_id,200 shopz,z_id这份文件的第三行数据与sale_detail的表定义不符。sale_detail定义了三列,但数据只有两列。 导入数据,如下所示:odps@ project_name>tunnel u d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false Upload session: 20150610xxxxxxxxxxx70a002ec60c Start upload:d:\data.txt Total bytes:41 Split input to 1 blocks 2015-06-10 16:39:22 upload block: '1' ERROR: column mismatch -,expected 3 columns, 2 columns found, please check data or delimiter由于data.txt中有脏数据,数据导入失败。并给出session id及错误提示信息。 数据验证,如下所示:odps@ odpstest_ay52c_ay52> select * from sale_detail where sale_date='201312'; ID = 20150610xxxxxxxxxxxvc61z5 +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ +-----------+-------------+-------------+-----------+--------+由于有脏数据,数据导入失败,表中无数据。 Show 显示历史记录。子命令使用提示: odps@ project_name>tunnel help show; usage: tunnel show history [options] show session information -n,-number <ARG> lines Example: tunnel show history -n 5 tunnel show log 参数说明: -n:指定显示行数。 示例如下: odps@ project_name>tunnel show history; 20150610xxxxxxxxxxx70a002ec60c failed 'u --config-file /D:/console/conf/odps_config.ini --project odpstest_ay52c_ay52 --endpoint http://service.odps.aliyun.com/api --id UlxxxxxxxxxxxrI1 --key 2m4r3WvTxxxxxxxxxx0InVke7UkvR d:\data.txt sale_detail/sale_date=201312,region=hangzhou -s false' 说明 20150610xxxxxxxxxxx70a002ec60c是上节中导入数据失败时的运行ID。 Resume 修复执行历史记录,仅对上传数据有效。子命令使用提示: odps@ project_name>tunnel help resume; usage: tunnel resume [session_id] [-force] resume an upload session -f,-force force resume Example: tunnel resume 示例如下: 修改data.txt文件为如下内容: shop9,97,100 shop10,10,200 修复执行上传数据,如下所示: odps@ project_name>tunnel resume 20150610xxxxxxxxxxx70a002ec60c --force; start resume 20150610xxxxxxxxxxx70a002ec60c Upload session: 20150610xxxxxxxxxxx70a002ec60c Start upload:d:\data.txt Resume 1 blocks 2015-06-10 16:46:42 upload block: '1' 2015-06-10 16:46:42 upload block complete, blockid=1 upload complete, average speed is 0 KB/s OK 说明 20150610xxxxxxxxxxx70a002ec60c为上传失败的session ID。 数据验证,如下所示: odps@ project_name>select * from sale_detail where sale_date='201312'; ID = 20150610xxxxxxxxxxxa741z5 +-----------+-------------+-------------+-----------+--------+ | shop_name | customer_id | total_price | sale_date | region | +-----------+-------------+-------------+-----------+--------+ | shopx | x_id | 100.0 | 201312 | hangzhou| | shopy | y_id | 200.0 | 201312 | hangzhou| +-----------+-------------+-------------+-----------+--------+ Download 子命令使用提示: odps@ project_name>tunnel help download; usage:tunnel download [options] <[project.]table[/partition]> <path> download data to local file -c,-charset <ARG> specify file charset, default ignore. set ignore to download raw data -ci,-columns-index <ARG> specify the columns index(starts from 0) to download, use comma to split each index -cn,-columns-name <ARG> specify the columns name to download, use comma to split each name -cp,-compress <ARG> compress, default true -dfp,-date-format-pattern <ARG> specify date format pattern, default yyyy-MM-dd HH:mm:ss -e,-exponential <ARG> When download double values, use exponential express if necessary. Otherwise at most 20 digits will be reserved. Default false -fd,-field-delimiter <ARG> specify field delimiter, support unicode, eg \u0001. default "," -h,-header <ARG> if local file should have table header, default false -limit <ARG> specify the number of records to download -ni,-null-indicator <ARG> specify null indicator string, default ""(empty string) -rd,-record-delimiter <ARG> specify record delimiter, support unicode, eg \u0001. default "\r\n" -sd,-session-dir <ARG> set session dir, default D:\software\odpscmd_public\plugins\dshi p -te,-tunnel_endpoint <ARG> tunnel endpoint -threads <ARG> number of threads, default 1 -tz,-time-zone <ARG> time zone, default local timezone: Asia/Shanghai usage: tunnel download [options] instance://<[project/]instance_id> <path> download instance result to local file -c,-charset <ARG> specify file charset, default ignore. set ignore to download raw data -ci,-columns-index <ARG> specify the columns index(starts from 0) to download, use comma to split each index -cn,-columns-name <ARG> specify the columns name to download, use comma to split each name -cp,-compress <ARG> compress, default true -dfp,-date-format-pattern <ARG> specify date format pattern, default yyyy-MM-dd HH:mm:ss -e,-exponential <ARG> When download double values, use exponential express if necessary. Otherwise at most 20 digits will be reserved. Default false -fd,-field-delimiter <ARG> specify field delimiter, support unicode, eg \u0001. default "," -h,-header <ARG> if local file should have table header, default false -limit <ARG> specify the number of records to download -ni,-null-indicator <ARG> specify null indicator string, default ""(empty string) -rd,-record-delimiter <ARG> specify record delimiter, support unicode, eg \u0001. default "\r\n" -sd,-session-dir <ARG> set session dir, default D:\software\odpscmd_public\plugins\dshi p -te,-tunnel_endpoint <ARG> tunnel endpoint -threads <ARG> number of threads, default 1 -tz,-time-zone <ARG> time zone, default local timezone: Asia/Shanghai Example: tunnel download test_project.test_table/p1="b1",p2="b2" log.txt tunnel download instance://test_project/test_instance log.txt 参数说明: -c:本地数据文件编码,默认为UTF-8。 -ci:指定列索引(从0)下载,使用逗号分隔。 -cn:指定要下载的列名称,使用逗号分隔每个名称。 -cp,-compress:指定是否压缩后再下载,减少网络流量,默认开启。 -dfp:DateTime类型数据格式,默认为yyyy-MM-dd HH:mm:ss。 -e:当下载double值时,如果需要,使用指数函数表示,否则最多保留20位。 -fd:本地数据文件的列分割符,默认为逗号。 -h:数据文件是否包括表头,如果为true,则dship会跳过表头从第二行开始下载数据。 说明 -h=true和threads>1即多线程不能一起使用。 -limit:指定要下载的文件数量。 -ni:NULL数据标志符,默认为“ ”(空字符串)。 -rd:本地数据文件的行分割符,默认为\r\n。 -sd:设置session目录。 -te:指定tunnel endpoint。 -threads:指定threads的数量,默认为1。 -tz:指定时区。默认为本地时区:Asia/Shanghai。 示例如下: 下载数据到 result.txt文件中,如下所示: $ ./tunnel download sale_detail/sale_date=201312,region=hangzhou result.txt; Download session: 20150610xxxxxxxxxxx70a002ed0b9 Total records: 2 2015-06-10 16:58:24 download records: 2 2015-06-10 16:58:24 file size: 30 bytes OK 验证 result.txt的文件内容,如下所示: shopx,x_id,100.0 shopy,y_id,200.0 Purge 清除session目录,默认清除距离当前日期3天内的。子命令使用提示: odps@ project_name>tunnel help purge; usage: tunnel purge [n] force session history to be purged.([n] days before, default 3 days) Example: tunnel purge 5 数据类型说明: 类型 描述 STRING 字符串类型,长度不能超过8MB。 BOOLEN 上传值只支持true、false、0和1。下载值为true/false且不区分大小写。 BIGINT 取值范围[-9223372036854775807,9223372036854775807]。 DOUBLE 有效位数16位 上传支持科学计数法表示 下载仅使用数字表示 最大值:1.7976931348623157E308 最小值:4.9E-324 无穷大:Infinity 无穷小:-Infinity DATETIME Datetime类型默认支持时区为GMT+8的数据上传,可以通过命令行指定用户数据日期格式的format pattern。 如果您上传DATETIME类型的数据,需要指定时间日期格式,具体格式请参见SimpleDateFormat。 "yyyyMMddHHmmss": 数据格式"20140209101000" "yyyy-MM-dd HH:mm:ss"(默认):数据格式"2014-02-09 10:10:00" "yyyy年MM月dd日": 数据格式"2014年09月01日" 示例如下: tunnel upload log.txt test_table -dfp "yyyy-MM-dd HH:mm:ss" 空值:所有数据类型都可以有空值。 默认空字符串为空值。 可在命令行下通过-null-indicator参数来指定空值的字符串。 tunnel upload log.txt test_table -ni "NULL" 字符编码:您可以指定文件的字符编码,默认为UTF-8。 tunnel upload log.txt test_table -c "gbk" 分隔符:tunnel命令支持您自定义的文件分隔符,行分隔符选项为-record-delimiter,列分隔符选项为-field-delimiter。 分隔符说明如下: 支持多个字符的行列分隔符。 列分隔符不能够包含行分隔符。 转义字符分隔符,在命令行方式下只支持\r、\n和\t。 示例如下: tunnel upload log.txt test_table -fd "||" -rd "\r\n"

2019-12-01 23:10:57 0 浏览量 回答数 0

问题

在Twig中,检查数组的特定键是否存在

保持可爱mmm 2020-02-09 11:24:04 0 浏览量 回答数 1

问题

PHP 收发消息如何实现?

猫饭先生 2019-12-01 21:15:06 1332 浏览量 回答数 0

回答

Spark 源码分析之ShuffleMapTask内存数据Spill和合并(文档详解):https://github.com/opensourceteams/spark-scala-maven/blob/master/md/ShuffleMapTaskSpillDiskFile.md Spark 源码分析之ShuffleMapTask内存数据Spill和合并更多资源分享SPARK 源码分析技术分享(视频汇总套装视频): https://www.bilibili.com/video/av37442139/github: https://github.com/opensourceteams/spark-scala-mavencsdn(汇总视频在线看): https://blog.csdn.net/thinktothings/article/details/84726769前置条件Hadoop版本: Hadoop 2.6.0-cdh5.15.0Spark版本: SPARK 1.6.0-cdh5.15.0JDK.1.8.0_191scala2.10.7技能标签Spark ShuffleMapTask 内存中的数据Spill到临时文件临时文件中的数据是如何定入的,如何按partition升序排序,再按Key升序排序写入(key,value)数据每个临时文件,都存入对应的每个分区有多少个(key,value)对,有多少次流提交数组,数组中保留每次流的大小如何把临时文件合成一个文件如何把内存中的数据和临时文件,进行分区,按key,排序后,再写入合并文件中内存中数据Spill到磁盘ShuffleMapTask进行当前分区的数据读取(此时读的是HDFS的当前分区,注意还有一个reduce分区,也就是ShuffleMapTask输出文件是已经按Reduce分区处理好的)SparkEnv指定默认的SortShuffleManager,getWriter()中匹配BaseShuffleHandle对象,返回SortShuffleWriter对象SortShuffleWriter,用的是ExternalSorter(外部排序对象进行排序处理),会把rdd.iterator(partition, context)的数据通过iterator插入到ExternalSorter中PartitionedAppendOnlyMap对象中做为内存中的map对象数据,每插入一条(key,value)的数据后,会对当前的内存中的集合进行判断,如果满足溢出文件的条件,就会把内存中的数据写入到SpillFile文件中满中溢出文件的条件是,每插入32条数据,并且,当前集合中的数据估值大于等于5m时,进行一次判断,会通过算法验证对内存的影响,确定是否可以溢出内存中的数据到文件,如果满足就把当前内存中的所有数据写到磁盘spillFile文件中SpillFile调用org.apache.spark.util.collection.ExternalSorter.SpillableIterator.spill()方法处理WritablePartitionedIterator迭代对象对内存中的数据进行迭代,DiskBlockObjectWriter对象写入磁盘,写入的数据格式为(key,value),不带partition的ExternalSorter.spillMemoryIteratorToDisk()这个方法将内存数据迭代对象WritablePartitionedIterator写入到一个临时文件,SpillFile临时文件用DiskBlockObjectWriter对象来写入数据临时文件的格式temp_local_+UUID遍历内存中的数据写入到临时文件,会记录每个临时文件中每个分区的(key,value)各有多少个,elementsPerPartition(partitionId) += 1 如果说数据很大的话,会每默认每10000条数据进行Flush()一次数据到文件中,会记录每一次Flush的数据大小batchSizes入到ArrayBuffer中保存并且在数据写入前,会进行排序,先按key的hash分区,先按partition的升序排序,再按key的升序排序,这样来写入文件中,以保证读取临时文件时可以分隔开每个临时文件的每个分区的数据,对于一个临时文件中一个分区的数据量比较大的话,会按流一批10000个(key,value)进行读取,读取的大小讯出在batchSizes数据中,就样读取的时候就非常方便了内存数据Spill和合并把数据insertAll()到ExternalSorter中,完成后,此时如果数据大的话,会进行溢出到临时文件的操作,数据写到临时文件后把当前内存中的数据和临时文件中的数据进行合并数据文件,合并后的文件只包含(key,value),并且是按partition升序排序,然后按key升序排序,输出文件名称:ShuffleDataBlockId(shuffleId, mapId, NOOP_REDUCE_ID) + UUID 即:"shuffle_" + shuffleId + "" + mapId + "" + reduceId + ".data" + UUID,reduceId为默认值0还会有一份索引文件: "shuffle_" + shuffleId + "" + mapId + "" + reduceId + ".index" + "." +UUID,索引文件依次存储每个partition的位置偏移量数据文件的写入分两种情况,一种是直接内存写入,没有溢出临时文件到磁盘中,这种是直接在内存中操作的(数据量相对小些),另外单独分析一种是有磁盘溢出文件的,这种情况是本文重点分析的情况ExternalSorter.partitionedIterator()方法可以处理所有磁盘中的临时文件和内存中的文件,返回一个可迭代的对象,里边放的元素为reduce用到的(partition,Iterator(key,value)),迭代器中的数据是按key升序排序的具体是通过ExternalSorter.mergeWithAggregation(),遍历每一个临时文件中当前partition的数据和内存中当前partition的数据,注意,临时文件数据读取时是按partition为0开始依次遍历的源码分析(内存中数据Spill到磁盘)ShuffleMapTask调用ShuffleMapTask.runTask()方法处理当前HDFS分区数据 调用SparkEnv.get.shuffleManager得到SortShuffleManager SortShuffleManager.getWriter()得到SortShuffleWriter 调用SortShuffleWriter.write()方法 SparkEnv.create() val shortShuffleMgrNames = Map( "hash" -> "org.apache.spark.shuffle.hash.HashShuffleManager", "sort" -> "org.apache.spark.shuffle.sort.SortShuffleManager", "tungsten-sort" -> "org.apache.spark.shuffle.sort.SortShuffleManager") val shuffleMgrName = conf.get("spark.shuffle.manager", "sort") val shuffleMgrClass = shortShuffleMgrNames.getOrElse(shuffleMgrName.toLowerCase, shuffleMgrName) val shuffleManager = instantiateClass[ShuffleManager](shuffleMgrClass) override def runTask(context: TaskContext): MapStatus = { // Deserialize the RDD using the broadcast variable. val deserializeStartTime = System.currentTimeMillis() val ser = SparkEnv.get.closureSerializer.newInstance() val (rdd, dep) = ser.deserialize[(RDD[_], ShuffleDependency[_, _, _])]( ByteBuffer.wrap(taskBinary.value), Thread.currentThread.getContextClassLoader) _executorDeserializeTime = System.currentTimeMillis() - deserializeStartTime metrics = Some(context.taskMetrics) var writer: ShuffleWriter[Any, Any] = null try { val manager = SparkEnv.get.shuffleManager writer = manager.getWriter[Any, Any](dep.shuffleHandle, partitionId, context) writer.write(rdd.iterator(partition, context).asInstanceOf[Iterator[_ <: Product2[Any, Any]]]) writer.stop(success = true).get } catch { case e: Exception => try { if (writer != null) { writer.stop(success = false) } } catch { case e: Exception => log.debug("Could not stop writer", e) } throw e } } SortShuffleWriter调用SortShuffleWriter.write()方法根据RDDDependency中mapSideCombine是否在map端合并,这个是由算子决定,reduceByKey中mapSideCombine为true,groupByKey中mapSideCombine为false,会new ExternalSorter()外部排序对象进行排序然后把records中的数据插入ExternalSorter对象sorter中,数据来源是HDFS当前的分区/* Write a bunch of records to this task's output / override def write(records: Iterator[Product2[K, V]]): Unit = { sorter = if (dep.mapSideCombine) { require(dep.aggregator.isDefined, "Map-side combine without Aggregator specified!") new ExternalSorter[K, V, C]( context, dep.aggregator, Some(dep.partitioner), dep.keyOrdering, dep.serializer) } else { // In this case we pass neither an aggregator nor an ordering to the sorter, because we don't // care whether the keys get sorted in each partition; that will be done on the reduce side // if the operation being run is sortByKey. new ExternalSorter[K, V, V]( context, aggregator = None, Some(dep.partitioner), ordering = None, dep.serializer) } sorter.insertAll(records) // Don't bother including the time to open the merged output file in the shuffle write time, // because it just opens a single file, so is typically too fast to measure accurately // (see SPARK-3570). val output = shuffleBlockResolver.getDataFile(dep.shuffleId, mapId) val tmp = Utils.tempFileWith(output) try { val blockId = ShuffleBlockId(dep.shuffleId, mapId, IndexShuffleBlockResolver.NOOP_REDUCE_ID) val partitionLengths = sorter.writePartitionedFile(blockId, tmp) shuffleBlockResolver.writeIndexFileAndCommit(dep.shuffleId, mapId, partitionLengths, tmp) mapStatus = MapStatus(blockManager.shuffleServerId, partitionLengths) } finally { if (tmp.exists() && !tmp.delete()) { logError(s"Error while deleting temp file ${tmp.getAbsolutePath}") } } }ExternalSorter.insertAll()方法该方法会把迭代器records中的数据插入到外部排序对象中ExternalSorter中的数据是不进行排序的,是以数组的形式存储的,健存的为(partition,key),值为Shuffle之前的RDD链计算结果 在内存中会对相同的key,进行合并操作,就是map端本地合并,合并的函数就是reduceByKey(+)这个算子中定义的函数maybeSpillCollection方法会判断是否满足磁盘溢出到临时文件,满足条件,会把当前内存中的数据写到磁盘中,写到磁盘中的数据是按partition升序排序,再按key升序排序,就是(key,value)的临时文件,不带partition,但是会记录每个分区的数量elementsPerPartition(partitionId- 记录每一次Flush的数据大小batchSizes入到ArrayBuffer中保存内存中的数据存在PartitionedAppendOnlyMap,记住这个对象,后面排序用到了这个里边的排序算法@volatile private var map = new PartitionedAppendOnlyMap[K, C] def insertAll(records: Iterator[Product2[K, V]]): Unit = { // TODO: stop combining if we find that the reduction factor isn't high val shouldCombine = aggregator.isDefined if (shouldCombine) { // Combine values in-memory first using our AppendOnlyMap val mergeValue = aggregator.get.mergeValue val createCombiner = aggregator.get.createCombiner var kv: Product2[K, V] = null val update = (hadValue: Boolean, oldValue: C) => { if (hadValue) mergeValue(oldValue, kv._2) else createCombiner(kv._2) } while (records.hasNext) { addElementsRead() kv = records.next() map.changeValue((getPartition(kv._1), kv._1), update) maybeSpillCollection(usingMap = true) } } else { // Stick values into our buffer while (records.hasNext) { addElementsRead() val kv = records.next() buffer.insert(getPartition(kv._1), kv._1, kv._2.asInstanceOf[C]) maybeSpillCollection(usingMap = false) } } } ExternalSorter.maybeSpillCollectionestimatedSize当前内存中数据预估占内存大小maybeSpill满足Spill条件就把内存中的数据写入到临时文件中调用ExternalSorter.maybeSpill()/** Spill the current in-memory collection to disk if needed.* @param usingMap whether we're using a map or buffer as our current in-memory collection*/ private def maybeSpillCollection(usingMap: Boolean): Unit = { var estimatedSize = 0L if (usingMap) { estimatedSize = map.estimateSize() if (maybeSpill(map, estimatedSize)) { map = new PartitionedAppendOnlyMap[K, C] } } else { estimatedSize = buffer.estimateSize() if (maybeSpill(buffer, estimatedSize)) { buffer = new PartitionedPairBuffer[K, C] } } if (estimatedSize > _peakMemoryUsedBytes) { _peakMemoryUsedBytes = estimatedSize } }ExternalSorter.maybeSpill()对内存中的数据遍历时,每遍历32个元素,进行判断,当前内存是否大于5m,如果大于5m,再进行内存的计算,如果满足就把内存中的数据写到临时文件中如果满足条件,调用ExternalSorter.spill()方法,将内存中的数据写入临时文件 /** Spills the current in-memory collection to disk if needed. Attempts to acquire more memory before spilling.* @param collection collection to spill to disk @param currentMemory estimated size of the collection in bytes @return true if collection was spilled to disk; false otherwise*/ protected def maybeSpill(collection: C, currentMemory: Long): Boolean = { var shouldSpill = false if (elementsRead % 32 == 0 && currentMemory >= myMemoryThreshold) { // Claim up to double our current memory from the shuffle memory pool val amountToRequest = 2 * currentMemory - myMemoryThreshold val granted = acquireOnHeapMemory(amountToRequest) myMemoryThreshold += granted // If we were granted too little memory to grow further (either tryToAcquire returned 0, // or we already had more memory than myMemoryThreshold), spill the current collection shouldSpill = currentMemory >= myMemoryThreshold } shouldSpill = shouldSpill || _elementsRead > numElementsForceSpillThreshold // Actually spill if (shouldSpill) { _spillCount += 1 logSpillage(currentMemory) spill(collection) _elementsRead = 0 _memoryBytesSpilled += currentMemory releaseMemory() } shouldSpill } ExternalSorter.spill()调用方法collection.destructiveSortedWritablePartitionedIterator进行排序,即调用PartitionedAppendOnlyMap.destructiveSortedWritablePartitionedIterator进行排序()方法排序,最终会调用WritablePartitionedPairCollection.destructiveSortedWritablePartitionedIterator()排序,调用方法WritablePartitionedPairCollection.partitionedDestructiveSortedIterator(),没有实现,调用子类PartitionedAppendOnlyMap.partitionedDestructiveSortedIterator()方法调用方法ExternalSorter.spillMemoryIteratorToDisk() 将磁盘中的数据写入到spillFile临时文件中 /** Spill our in-memory collection to a sorted file that we can merge later. We add this file into spilledFiles to find it later.* @param collection whichever collection we're using (map or buffer)*/ override protected[this] def spill(collection: WritablePartitionedPairCollection[K, C]): Unit = { val inMemoryIterator = collection.destructiveSortedWritablePartitionedIterator(comparator) val spillFile = spillMemoryIteratorToDisk(inMemoryIterator) spills.append(spillFile) }PartitionedAppendOnlyMap.partitionedDestructiveSortedIterator()调用排序算法WritablePartitionedPairCollection.partitionKeyComparator即先按分区数的升序排序,再按key的升序排序/** Implementation of WritablePartitionedPairCollection that wraps a map in which the keys are tuples of (partition ID, K)*/ private[spark] class PartitionedAppendOnlyMap[K, V] extends SizeTrackingAppendOnlyMap[(Int, K), V] with WritablePartitionedPairCollection[K, V] { def partitionedDestructiveSortedIterator(keyComparator: Option[Comparator[K]]) : Iterator[((Int, K), V)] = { val comparator = keyComparator.map(partitionKeyComparator).getOrElse(partitionComparator) destructiveSortedIterator(comparator) } def insert(partition: Int, key: K, value: V): Unit = { update((partition, key), value) }} /** A comparator for (Int, K) pairs that orders them both by their partition ID and a key ordering.*/ def partitionKeyComparatorK: Comparator[(Int, K)] = { new Comparator[(Int, K)] { override def compare(a: (Int, K), b: (Int, K)): Int = { val partitionDiff = a._1 - b._1 if (partitionDiff != 0) { partitionDiff } else { keyComparator.compare(a._2, b._2) } } } }}ExternalSorter.spillMemoryIteratorToDisk()创建blockId : temp_shuffle_ + UUID溢出到磁盘临时文件: temp_shuffle_ + UUID遍历内存数据inMemoryIterator写入到磁盘临时文件spillFile遍历内存中的数据写入到临时文件,会记录每个临时文件中每个分区的(key,value)各有多少个,elementsPerPartition(partitionId) 如果说数据很大的话,会每默认每10000条数据进行Flush()一次数据到文件中,会记录每一次Flush的数据大小batchSizes入到ArrayBuffer中保存/** Spill contents of in-memory iterator to a temporary file on disk.*/ private[this] def spillMemoryIteratorToDisk(inMemoryIterator: WritablePartitionedIterator) : SpilledFile = { // Because these files may be read during shuffle, their compression must be controlled by // spark.shuffle.compress instead of spark.shuffle.spill.compress, so we need to use // createTempShuffleBlock here; see SPARK-3426 for more context. val (blockId, file) = diskBlockManager.createTempShuffleBlock() // These variables are reset after each flush var objectsWritten: Long = 0 var spillMetrics: ShuffleWriteMetrics = null var writer: DiskBlockObjectWriter = null def openWriter(): Unit = { assert (writer == null && spillMetrics == null) spillMetrics = new ShuffleWriteMetrics writer = blockManager.getDiskWriter(blockId, file, serInstance, fileBufferSize, spillMetrics) } openWriter() // List of batch sizes (bytes) in the order they are written to disk val batchSizes = new ArrayBuffer[Long] // How many elements we have in each partition val elementsPerPartition = new Array[Long](numPartitions) // Flush the disk writer's contents to disk, and update relevant variables. // The writer is closed at the end of this process, and cannot be reused. def flush(): Unit = { val w = writer writer = null w.commitAndClose() _diskBytesSpilled += spillMetrics.shuffleBytesWritten batchSizes.append(spillMetrics.shuffleBytesWritten) spillMetrics = null objectsWritten = 0 } var success = false try { while (inMemoryIterator.hasNext) { val partitionId = inMemoryIterator.nextPartition() require(partitionId >= 0 && partitionId < numPartitions, s"partition Id: ${partitionId} should be in the range [0, ${numPartitions})") inMemoryIterator.writeNext(writer) elementsPerPartition(partitionId) += 1 objectsWritten += 1 if (objectsWritten == serializerBatchSize) { flush() openWriter() } } if (objectsWritten > 0) { flush() } else if (writer != null) { val w = writer writer = null w.revertPartialWritesAndClose() } success = true } finally { if (!success) { // This code path only happens if an exception was thrown above before we set success; // close our stuff and let the exception be thrown further if (writer != null) { writer.revertPartialWritesAndClose() } if (file.exists()) { if (!file.delete()) { logWarning(s"Error deleting ${file}") } } } } SpilledFile(file, blockId, batchSizes.toArray, elementsPerPartition) } 源码分析(内存数据Spill合并)SortShuffleWriter.insertAll即内存中的数据,如果有溢出,写入到临时文件后,可能会有多个临时文件(看数据的大小) 这时要开始从所有的临时文件中,shuffle出按给reduce输入数据(partition,Iterator),相当于要对多个临时文件进行合成一个文件,合成的结果按partition升序排序,再按Key升序排序 SortShuffleWriter.write 得到合成文件shuffleBlockResolver.getDataFile : 格式如 "shuffle_" + shuffleId + "" + mapId + "" + reduceId + ".data" + "." + UUID,reduceId为默认的0 调用关键方法ExternalSorter的sorter.writePartitionedFile,这才是真正合成文件的方法 返回值partitionLengths,即为数据文件中对应索引文件按分区从0到最大分区,每个分区的数据大小的数组 /* Write a bunch of records to this task's output / override def write(records: Iterator[Product2[K, V]]): Unit = { sorter = if (dep.mapSideCombine) { require(dep.aggregator.isDefined, "Map-side combine without Aggregator specified!") new ExternalSorter[K, V, C]( context, dep.aggregator, Some(dep.partitioner), dep.keyOrdering, dep.serializer) } else { // In this case we pass neither an aggregator nor an ordering to the sorter, because we don't // care whether the keys get sorted in each partition; that will be done on the reduce side // if the operation being run is sortByKey. new ExternalSorter[K, V, V]( context, aggregator = None, Some(dep.partitioner), ordering = None, dep.serializer) } sorter.insertAll(records) // Don't bother including the time to open the merged output file in the shuffle write time, // because it just opens a single file, so is typically too fast to measure accurately // (see SPARK-3570). val output = shuffleBlockResolver.getDataFile(dep.shuffleId, mapId) val tmp = Utils.tempFileWith(output) try { val blockId = ShuffleBlockId(dep.shuffleId, mapId, IndexShuffleBlockResolver.NOOP_REDUCE_ID) val partitionLengths = sorter.writePartitionedFile(blockId, tmp) shuffleBlockResolver.writeIndexFileAndCommit(dep.shuffleId, mapId, partitionLengths, tmp) mapStatus = MapStatus(blockManager.shuffleServerId, partitionLengths) } finally { if (tmp.exists() && !tmp.delete()) { logError(s"Error while deleting temp file ${tmp.getAbsolutePath}") } } } ExternalSorter.writePartitionedFile按方法名直译,把数据写入已分区的文件中如果没有spill文件,直接按ExternalSorter在内存中排序,用的是TimSort排序算法排序,单独合出来讲,这里不详细讲如果有spill文件,是我们重点分析的,这个时候,调用this.partitionedIterator按回按[(partition,Iterator)],按分区升序排序,按(key,value)中key升序排序的数据,并键中方法this.partitionedIterator()写入合并文件中,并返回写入合并文件中每个分区的长度,放到lengths数组中,数组索引就是partition/** Write all the data added into this ExternalSorter into a file in the disk store. This is called by the SortShuffleWriter.* @param blockId block ID to write to. The index file will be blockId.name + ".index". @return array of lengths, in bytes, of each partition of the file (used by map output tracker)*/ def writePartitionedFile( blockId: BlockId, outputFile: File): Array[Long] = { // Track location of each range in the output file val lengths = new Array[Long](numPartitions) if (spills.isEmpty) { // Case where we only have in-memory data val collection = if (aggregator.isDefined) map else buffer val it = collection.destructiveSortedWritablePartitionedIterator(comparator) while (it.hasNext) { val writer = blockManager.getDiskWriter(blockId, outputFile, serInstance, fileBufferSize, context.taskMetrics.shuffleWriteMetrics.get) val partitionId = it.nextPartition() while (it.hasNext && it.nextPartition() == partitionId) { it.writeNext(writer) } writer.commitAndClose() val segment = writer.fileSegment() lengths(partitionId) = segment.length } } else { // We must perform merge-sort; get an iterator by partition and write everything directly. for ((id, elements) <- this.partitionedIterator) { if (elements.hasNext) { val writer = blockManager.getDiskWriter(blockId, outputFile, serInstance, fileBufferSize, context.taskMetrics.shuffleWriteMetrics.get) for (elem <- elements) { writer.write(elem._1, elem._2) } writer.commitAndClose() val segment = writer.fileSegment() lengths(id) = segment.length } } } context.taskMetrics().incMemoryBytesSpilled(memoryBytesSpilled) context.taskMetrics().incDiskBytesSpilled(diskBytesSpilled) context.internalMetricsToAccumulators( InternalAccumulator.PEAK_EXECUTION_MEMORY).add(peakMemoryUsedBytes) lengths } this.partitionedIterator()直接调用ExternalSorter.merge()方法临时文件参数spills内存文件排序算法在这里调用collection.partitionedDestructiveSortedIterator(comparator),实际调的是PartitionedAppendOnlyMap.partitionedDestructiveSortedIterator,定义了排序算法partitionKeyComparator,即按partition升序排序,再按key升序排序/** Return an iterator over all the data written to this object, grouped by partition and aggregated by the requested aggregator. For each partition we then have an iterator over its contents, and these are expected to be accessed in order (you can't "skip ahead" to one partition without reading the previous one). Guaranteed to return a key-value pair for each partition, in order of partition ID.* For now, we just merge all the spilled files in once pass, but this can be modified to support hierarchical merging. Exposed for testing.*/ def partitionedIterator: Iterator[(Int, Iterator[Product2[K, C]])] = { val usingMap = aggregator.isDefined val collection: WritablePartitionedPairCollection[K, C] = if (usingMap) map else buffer if (spills.isEmpty) { // Special case: if we have only in-memory data, we don't need to merge streams, and perhaps // we don't even need to sort by anything other than partition ID if (!ordering.isDefined) { // The user hasn't requested sorted keys, so only sort by partition ID, not key groupByPartition(destructiveIterator(collection.partitionedDestructiveSortedIterator(None))) } else { // We do need to sort by both partition ID and key groupByPartition(destructiveIterator( collection.partitionedDestructiveSortedIterator(Some(keyComparator)))) } } else { // Merge spilled and in-memory data merge(spills, destructiveIterator( collection.partitionedDestructiveSortedIterator(comparator))) } } ExternalSorter.merge()方法0 until numPartitions 从0到numPartitions(不包含)分区循环调用IteratorForPartition(p, inMemBuffered),每次取内存中的p分区的数据readers是每个分区是读所有的临时文件(因为每份临时文件,都有可能包含p分区的数据),readers.map(_.readNextPartition())该方法内部用的是每次调一个分区的数据,从0开始,刚好对应的是p分区的数据readNextPartition方法即调用SpillReader.readNextPartition()方法对p分区的数据进行mergeWithAggregation合并后,再写入到合并文件中 /** Merge a sequence of sorted files, giving an iterator over partitions and then over elements inside each partition. This can be used to either write out a new file or return data to the user.* Returns an iterator over all the data written to this object, grouped by partition. For each partition we then have an iterator over its contents, and these are expected to be accessed in order (you can't "skip ahead" to one partition without reading the previous one). Guaranteed to return a key-value pair for each partition, in order of partition ID.*/ private def merge(spills: Seq[SpilledFile], inMemory: Iterator[((Int, K), C)]) : Iterator[(Int, Iterator[Product2[K, C]])] = { val readers = spills.map(new SpillReader(_)) val inMemBuffered = inMemory.buffered (0 until numPartitions).iterator.map { p => val inMemIterator = new IteratorForPartition(p, inMemBuffered) val iterators = readers.map(_.readNextPartition()) ++ Seq(inMemIterator) if (aggregator.isDefined) { // Perform partial aggregation across partitions (p, mergeWithAggregation( iterators, aggregator.get.mergeCombiners, keyComparator, ordering.isDefined)) } else if (ordering.isDefined) { // No aggregator given, but we have an ordering (e.g. used by reduce tasks in sortByKey); // sort the elements without trying to merge them (p, mergeSort(iterators, ordering.get)) } else { (p, iterators.iterator.flatten) } } } SpillReader.readNextPartition()readNextItem()是真正读数临时文件的方法,deserializeStream每次读取一个流大小,这个大小时在spill输出文件时写到batchSizes中的,某个是每个分区写一次流,如果分区中的数据很大,就按10000条数据进行一次流,这样每满10000次就再读一次流,这样就可以把当前分区里边的多少提交流全部读完一进来就执行nextBatchStream()方法,该方法是按数组batchSizes存储着每次写入流时的数据大小val batchOffsets = spill.serializerBatchSizes.scanLeft(0L)(_ + _)这个其实取到的值,就刚好是每次流的一位置偏移量,后面的偏移量,刚好是前面所有偏移量之和当前分区的流读完时,就为空,就相当于当前分区的数据全部读完了当partitionId=numPartitions,finished= true说明所有分区的所有文件全部读完了def readNextPartition(): Iterator[Product2[K, C]] = new Iterator[Product2[K, C]] { val myPartition = nextPartitionToRead nextPartitionToRead += 1 override def hasNext: Boolean = { if (nextItem == null) { nextItem = readNextItem() if (nextItem == null) { return false } } assert(lastPartitionId >= myPartition) // Check that we're still in the right partition; note that readNextItem will have returned // null at EOF above so we would've returned false there lastPartitionId == myPartition } override def next(): Product2[K, C] = { if (!hasNext) { throw new NoSuchElementException } val item = nextItem nextItem = null item } } /** * Return the next (K, C) pair from the deserialization stream and update partitionId, * indexInPartition, indexInBatch and such to match its location. * * If the current batch is drained, construct a stream for the next batch and read from it. * If no more pairs are left, return null. */ private def readNextItem(): (K, C) = { if (finished || deserializeStream == null) { return null } val k = deserializeStream.readKey().asInstanceOf[K] val c = deserializeStream.readValue().asInstanceOf[C] lastPartitionId = partitionId // Start reading the next batch if we're done with this one indexInBatch += 1 if (indexInBatch == serializerBatchSize) { indexInBatch = 0 deserializeStream = nextBatchStream() } // Update the partition location of the element we're reading indexInPartition += 1 skipToNextPartition() // If we've finished reading the last partition, remember that we're done if (partitionId == numPartitions) { finished = true if (deserializeStream != null) { deserializeStream.close() } } (k, c) } /* Construct a stream that only reads from the next batch / def nextBatchStream(): DeserializationStream = { // Note that batchOffsets.length = numBatches + 1 since we did a scan above; check whether // we're still in a valid batch. if (batchId < batchOffsets.length - 1) { if (deserializeStream != null) { deserializeStream.close() fileStream.close() deserializeStream = null fileStream = null } val start = batchOffsets(batchId) fileStream = new FileInputStream(spill.file) fileStream.getChannel.position(start) batchId += 1 val end = batchOffsets(batchId) assert(end >= start, "start = " + start + ", end = " + end + ", batchOffsets = " + batchOffsets.mkString("[", ", ", "]")) val bufferedStream = new BufferedInputStream(ByteStreams.limit(fileStream, end - start)) val sparkConf = SparkEnv.get.conf val stream = blockManager.wrapForCompression(spill.blockId, CryptoStreamUtils.wrapForEncryption(bufferedStream, sparkConf)) serInstance.deserializeStream(stream) } else { // No more batches left cleanup() null } } end

thinktothings 2019-12-02 01:47:56 0 浏览量 回答数 0

问题

求教 php如何快捷判断数组中的项是单值或者是键值对?

落地花开啦 2019-12-01 19:51:43 824 浏览量 回答数 1

回答

Aliyun Function Compute API Specification Overview Version information Version : 0.1 URI scheme Host : $account-id.$region.fc.aliyuncs.com BasePath : /version, version 是指函数计算提供的 api 的版本,即 api-version; 目前的 api-version 为 2016-08-15 。 Schemes : HTTP, HTTPS Tags Service : Service相关的操作 Function : Function相关的操作 Trigger : Trigger相关的操作 Version : Version相关的操作 Alias :Alias相关的操作 CustomDomain: CustomDomain相关的操作 ProvisionConfig: ProvisionConfig相关的操作 Consumes application/json Produces application/json Resources Service Service相关的操作 CreateService ListServices GetService UpdateService DeleteService Function Function相关的操作 CreateFunction ListFunctions GetFunction UpdateFunction DeleteFunction GetFunctionCode InvokeFunction Trigger Trigger相关的操作 CreateTrigger ListTriggers GetTrigger UpdateTrigger DeleteTrigger Version Version相关的操作 PublishVersion ListVersions DeleteVersion Alias Alias相关的操作 CreateAlias ListAliases GetAlias UpdateAlias DeleteAlias CustomDomain CustomDomain 相关的操作 CreateCustomDomain ListCustomDomain GetCustomDomain UpdateCustomDomain DeleteCustomDomain ProvisionConfig ProvisionConfig 相关的操作 PutProvisionConfig GetProvisionConfig ListProvisionConfigs Tag Tag 相关的操作 TagResource UntagResource GetResourceTags Operations CreateFunction POST /services/{serviceName}/functions Description 创建function Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Path serviceName required service名称 string Body body required function对象描述 Function Responses HTTP Code Description Schema 200 创建成功 Headers : ETag (string) : function etag,用于更改function。以确保实际更改的function和期望更改的function是一致的. FunctionResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service不存在,错误码:ServiceNotFound Error 409 function已存在,错误码:FunctionAlreadyExists Error 500 服务内部错误,错误码:InternalServerError Error CreateService POST /services Description 创建service Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Body body required service对象描述 Service Responses HTTP Code Description Schema 200 创建成功 Headers : ETag (string) : service etag,用于更改service。以确保实际更改的service和期望更改的service是一致的. ServiceResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 409 service已存在,错误码:ServiceAlreadyExists Error 500 服务内部错误,错误码:InternalServerError Error CreateTrigger POST /services/{serviceName}/functions/{functionName}/triggers Description 创建trigger Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Path functionName required function名称 string Path serviceName required service名称 string Body body required trigger对象 Trigger Responses HTTP Code Description Schema 200 创建成功 Headers : ETag (string) : trigger etag,用于更改trigger。以确保实际更改的trigger和期望更改的trigger是一致的. TriggerResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service或function不存在,错误码:ServiceNotFound,FunctionNotFound Error 409 Trigger already exists. Error code is TriggerAlreadyExists. Error 500 服务内部错误,错误码:InternalServerError Error PublishVersion POST /services/{serviceName}/versions Description 发布version Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Header If-Match optional 用于确保实际更改的资源和期望更改的资源是一致的,该值来自Create,Get和Update Service API的响应 string Path serviceName required service名称 string Body body optional version描述 string Responses HTTP Code Description Schema 200 发布成功 Headers : ETag (string) : version etag,用以确保实际发布的service和期望发布的version是一致的. VersionResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service不存在,错误码:ServiceNotFound Error 409 service发布失败,错误码:VersionPublishError, ConcurrentUpdateError Error 500 服务内部错误,错误码:InternalServerError Error CreateAlias POST /services/{serviceName}/aliases Description 创建alias Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Path serviceName required service名称 string Body body required alias名称 string Body body required versionId string Body body optional alias描述 string Body body optional 灰度发布的版本,以及对应的流量权重 map Responses HTTP Code Description Schema 200 创建成功 Headers : ETag (string) : alias etag,用以确保实际更改的alias和期望更改的alias是一致的. ||400|请求无效,错误码:InvalidArgument|Error||403|拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed|Error||404|service或者version不存在,错误码:ServiceNotFound,VersionNotFound|Error||409|alias已经存在,错误码:AliasAlreadyExists.|Error||500|服务内部错误,错误码:InternalServerError|Error| DeleteFunction DELETE /services/{serviceName}/functions/{functionName} Description 删除function Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Header If-Match optional 用于确保实际更改的资源和期望更改的资源是一致的,该值来自Create,Get和Update API的响应 string Path functionName required function名称 string Path serviceName required service名称 string Responses HTTP Code Description Schema 204 删除成功 No Content 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service或function不存在,错误码:ServiceNotFound,FunctionNotFound Error 409 function非空,包含至少一个trigger,错误码:FunctionNotEmpty; 多个线程同时删除,错误码:ConcurrentUpdateError Error 500 服务内部错误,错误码:InternalServerError Error DeleteService DELETE /services/{serviceName} Description 删除service Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Header If-Match optional 用于确保实际更改的资源和期望更改的资源是一致的,该值来自Create,Get和Update API的响应 string Path serviceName required service名称 string Responses HTTP Code Description Schema 204 删除成功 No Content 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service不存在,错误码:ServiceNotFound Error 409 service非空,错误码:ServiceNotEmpty; 多个线程同时删除,错误码:ConcurrentUpdateError Error 500 服务内部错误,错误码:InternalServerError Error DeleteTrigger DELETE /services/{serviceName}/functions/{functionName}/triggers/{triggerName} Description 删除trigger Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Header If-Match optional 用于确保实际更改的资源和期望更改的资源是一致的,该值来自Create,Get和Update API的响应 string Path functionName required function名称 string Path serviceName required service名称 string Path triggerName required trigger名称 string Responses HTTP Code Description Schema 204 删除成功 No Content 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service,function,trigger不存在,错误码:ServiceNotFound,FunctionNotFound,TriggerNotFound Error 409 多个线程同时删除,错误码:ConcurrentUpdateError Error 500 服务内部错误,错误码:InternalServerError Error DeleteVersion DELETE /services/{serviceName}/versions/{versionId} Description 删除version Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Path serviceName required service名称 string Path versionId required versionId string Responses HTTP Code Description Schema 204 删除成功 No Content 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 version不存在,错误码:VersionNotFound Error 409 多个线程同时删除,错误码:ConcurrentUpdateError Error 500 服务内部错误,错误码:InternalServerError Error DeleteAlias DELETE /services/{serviceName}/aliases/{aliasName} Description 删除alias Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Header If-Match optional 用于确保实际更改的资源和期望更改的资源是一致的,该值来自Create,Get和Update Alias API的响应 string Path serviceName required service名称 string Path aliasName required alias名称 string Responses HTTP Code Description Schema 204 删除成功 No Content 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 alias不存在,错误码:AliasNotFound Error 409 多个线程同时删除,错误码:ConcurrentUpdateError Error 500 服务内部错误,错误码:InternalServerError Error GetFunction GET /services/{serviceName}/functions/{functionName} GET /services/{serviceName}.{qualifier}/functions/{functionName} Description 获取function信息 Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Path functionName required function名称 string Path serviceName required service名称 string Path qualifier optional service版本, 可以是versionId或者aliasName string Responses HTTP Code Description Schema 200 请求成功 Headers : ETag (string) : function etag,用于更改function。以确保实际更改的function和期望更改的function是一致的. FunctionResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service,function,alias或者version不存在,错误码:ServiceNotFound,FunctionNotFound,VersionNotFound,AliasNotFound Error 500 服务内部错误,错误码:InternalServerError Error GetFunctionCode GET /services/{serviceName}/functions/{functionName}/code GET /services/{serviceName}.{qualifier}/functions/{functionName}/code Description 获取Function代码 Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Path functionName required function名称 string Path serviceName required service名称 string Path qualifier optional service版本, 可以是versionId或者aliasName string Responses HTTP Code Description Schema 200 请求成功 FunctionCodeResponse 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service,function,alias或者version不存在,错误码:ServiceNotFound,FunctionNotFound,VersionNotFound,AliasNotFound Error 500 服务内部错误,错误码:InternalServerError Error GetService GET /services/{serviceName} GET /services/{serviceName}.{qualifier} Description 获取service信息 Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Path serviceName required service名称 string Path qualifier optional service版本, 可以是versionId或者aliasName string Responses HTTP Code Description Schema 200 请求成功 Headers : ETag (string) : service etag,用于更改service。以确保实际更改的service和期望更改的service是一致的. ServiceResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service,alias或者version不存在,错误码:ServiceNotFound,VersionNotFound,AliasNotFound Error 500 服务内部错误,错误码:InternalServerError Error GetAlias GET /services/{serviceName}/aliases/{aliasName} Description 获取alias信息 Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Header If-Match optional 用于确保实际更改的资源和期望更改的资源是一致的,该值来自Create,Get和Update Alias API的响应 string Path serviceName required service名称 string Path aliasName required alias名称 string Responses HTTP Code Description Schema 200 请求成功 Headers : ETag (string) : alias etag,用于更改alias。以确保实际更改的alias和期望更改的alias是一致的. AliasResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 alias不存在,错误码:AliasNotFound Error 409 多个线程同时更新,错误码:ConcurrentUpdateError Error 500 服务内部错误,错误码:InternalServerError Error GetTrigger GET /services/{serviceName}/functions/{functionName}/triggers/{triggerName} Description 获取trigger信息 Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Path functionName required function名称 string Path serviceName required service名称 string Path triggerName required trigger名称 string Responses HTTP Code Description Schema 200 请求成功 Headers : ETag (string) : trigger etag,用于更改trigger。以确保实际更改的trigger和期望更改的trigger是一致的. TriggerResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service,function,trigger不存在,错误码:ServiceNotFound,FunctionNotFound,TriggerNotFound Error 500 服务内部错误,错误码:InternalServerError Error InvokeFunction POST /services/{serviceName}/functions/{functionName}/invocations POST /services/{serviceName}.{qualifier}/functions/{functionName}/invocations Description 同步或异步调用function Parameters Type Name Description Schema Default Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Header X-Fc-Invocation-Type optional 调用方式:Sync或者Async string "Sync" Path functionName required function名称 string Path serviceName required service名称 string Path qualifier optional service版本, 可以是versionId或者aliasName string Body body required 事件(event),binary type。函数计算服务将event传递给用户function来处理 object Responses HTTP Code Description Schema 200 同步调用成功,返回函数结果 Headers : X-Fc-Error-Type (string) : 调用function的错误类型,分为HandledInvocationError和UnhandledInvocationError两种。. InvokeResponse 202 异步调用,服务器已接受请求但可能尚未处理 No Content 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service,function,alias或者version不存在,错误码:ServiceNotFound,FunctionNotFound,VersionNotFound,AliasNotFound Error 500 服务内部错误,错误码:InternalServerError Error ListFunctions GET /services/{serviceName}/functions GET /services/{serviceName}.{qualifier}/functions Description 获取function列表 Parameters Type Name Description Schema Default Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Path serviceName required service名称 string Path qualifier optional service版本, 可以是versionId或者aliasName string Query limit optional 限定此次返回资源的数量。如果不设定,默认返回20,最大不能超过100。返回结果可能小于指定的数量,但不会多于指定的数量 integer (int32) 20 Query nextToken optional 用来返回更多结果。第一次查询不需要提供这个参数,后续查询的token从返回结果中获取 string Query prefix optional 限定返回的资源名称必须以prefix作为前缀 string Query startKey optional 设定结果从startKey之后(包括startKey)按字母排序的第一个开始返回 string Responses HTTP Code Description Schema 200 请求成功 Response 200 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service,alias或者version不存在,错误码:ServiceNotFound,VersionNotFound,AliasNotFound Error 500 服务内部错误,错误码:InternalServerError Error Response 200 Name Schema functions optional < functions > array nextToken optional NextToken functions Name Description Schema codeChecksum optional function code包的CRC64值 Example : "5434025278388143772" string codeSize optional 系统返回的function的code包大小,单位为byte Example : 1024 integer (int64) createdTime optional function创建时间 Example : "2016-08-15T15:00:00.000+0000" string description optional Example : "This is a demo hello world function." string functionId optional 系统为每个function生成的唯一ID Example : "2d28e0e9-9ba5-4eed-8b1a-d3d9cd24e737" string functionName optional Example : "helloworld" string handler optional function的执行入口 Example : "hello_world.main" string lastModifiedTime optional function上次修改时间 Example : "2016-08-15T17:00:00.000+0000" string memorySize optional function设置的内存大小,单位为MB Example : 512 integer (int32) runtime optional function运行的语言环境,目前支持nodejs6, nodejs8, python2.7, python3, java8 Example : "nodejs4.4" string timeout optional 运行的超时时间,单位为秒 Example : 10 integer (int32) ListServices GET /services Description 获取service列表 Parameters Type Name Description Schema Default Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Query limit optional 限定此次返回资源的数量。如果不设定,默认返回20,最大不能超过100。返回结果可能小于指定的数量,但不会多于指定的数量 integer (int32) 20 Query nextToken optional 用来返回更多结果。第一次查询不需要提供这个参数,后续查询的token从返回结果中获取 string Query prefix optional 限定返回的资源名称必须以prefix作为前缀 string Query startKey optional 设定结果从startKey之后(包括startKey)按字母排序的第一个开始返回 string Responses HTTP Code Description Schema 200 请求成功 Response 200 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 500 服务内部错误,错误码:InternalServerError Error Response 200 Name Schema nextToken optional NextToken services optional < services > array services Name Description Schema createdTime optional service的创建时间 Example : "2016-08-15T16:06:05.000+0000" string description optional service的简短描述信息 Example : "This is a demo service." string internetAccess optional 设为true让function可以访问公网 Example : true boolean lastModifiedTime optional service上次更新时间 Example : "2016-08-16T18:00:00.000+0000" string logConfig optional log配置,function产生的log会写入这里配置的logstore LogConfig role optional 授予函数计算所需权限的RAM role, 使用场景包含 1. 从用户 bucket 中 copy function code 2. 把 function产生的 log 发送到用户的 logstore 中 3. 为function 在执行中访问其它云资源生成 token Example : "acs:ram::1234567890:role/fc-test" string serviceId optional 系统为每个service生成的唯一ID Example : "2d28e0e9-9ba5-4eed-8b1a-d3d9cd24e737" string serviceName optional Example : "demo-service" string vpcConfig optional vpc配置, 配置后function可以访问指定VPC VPCConfig ListTriggers GET /services/{serviceName}/functions/{functionName}/triggers Description 获取trigger列表 Parameters Type Name Description Schema Default Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Path functionName required function名称 string Path serviceName required service名称 string Query limit optional 限定此次返回资源的数量。如果不设定,默认返回20,最大不能超过100。返回结果可能小于指定的数量,但不会多于指定的数量 integer (int32) 20 Query nextToken optional 用来返回更多结果。第一次查询不需要提供这个参数,后续查询的token从返回结果中获取 string Query prefix optional 限定返回的资源名称必须以prefix作为前缀 string Query startKey optional 设定结果从startKey之后(包括startKey)按字母排序的第一个开始返回 string Responses HTTP Code Description Schema 200 请求成功 Response 200 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service或function不存在,错误码:ServiceNotFound,FunctionNotFound Error 500 服务内部错误,错误码:InternalServerError Error Response 200 Name Schema nextToken optional NextToken triggers optional < TriggerResponse > array ListVersions GET /services/{serviceName}/versions Description 获取version列表 Parameters Type Name Description Schema Default Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Path serviceName required service名称 string Query limit optional 限定此次返回资源的数量。如果不设定,默认返回20,最大不能超过100。返回结果可能小于指定的数量,但不会多于指定的数量 integer (int32) 20 Query nextToken optional 用来返回更多结果。第一次查询不需要提供这个参数,后续查询的token从返回结果中获取 string Query startKey optional 设定结果从startKey之后(包括startKey)按版本号排序的第一个开始返回 string Query direction optional 限定返回的资源排序方向 string BACKWARD Responses HTTP Code Description Schema 200 请求成功 Response 200 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service不存在,错误码:ServiceNotFound Error 500 服务内部错误,错误码:InternalServerError Error Response 200 Name Schema nextToken optional NextToken versions optional < VersionResponse > array direction optional string ListAliases GET /services/{serviceName}/aliases Description 获取alias列表 Parameters Type Name Description Schema Default Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Path serviceName required service名称 string Query limit optional 限定此次返回资源的数量。如果不设定,默认返回20,最大不能超过100。返回结果可能小于指定的数量,但不会多于指定的数量 integer (int32) 20 Query nextToken optional 用来返回更多结果。第一次查询不需要提供这个参数,后续查询的token从返回结果中获取 string Query prefix optional 限定返回的资源名称必须以prefix作为前缀 string Query startKey optional 设定结果从startKey之后(包括startKey)按字母排序的第一个开始返回 string Responses HTTP Code Description Schema 200 请求成功 Response 200 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service不存在,错误码:ServiceNotFound Error 500 服务内部错误,错误码:InternalServerError Error Response 200 Name Schema nextToken optional NextToken aliases optional < AliasResponse > array UpdateFunction PUT /services/{serviceName}/functions/{functionName} Description 更新function Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Header If-Match optional 用于确保实际更改的资源和期望更改的资源是一致的,该值来自Create,Get和Update API的响应 string Path functionName required function名称 string Path serviceName required service名称 string Body function required function更新对象描述 FunctionUpdateFields Responses HTTP Code Description Schema 200 请求成功 Headers : ETag (string) : function etag,用于更改function。以确保实际更改的function和期望更改的function是一致的. FunctionResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service或function不存在,错误码:ServiceNotFound,FunctionNotFound Error 409 多个线程同时更新,错误码:ConcurrentUpdateError Error 500 服务内部错误,错误码:InternalServerError Error UpdateService PUT /services/{serviceName} Description 更新service Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Header If-Match optional 用于确保实际更改的资源和期望更改的资源是一致的,该值来自Create,Get和Update API的响应 string Path serviceName required service名称 string Body body required service更新描述 ServiceUpdateFields Responses HTTP Code Description Schema 200 请求成功 Headers : ETag (string) : service etag,用于更改service。以确保实际更改的service和期望更改的service是一致的. ServiceResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service不存在,错误码:ServiceNotFound Error 409 多个线程同时更新,错误码:ConcurrentUpdateError Error 500 服务内部错误,错误码:InternalServerError Error UpdateTrigger PUT /services/{serviceName}/functions/{functionName}/triggers/{triggerName} Description 更新trigger Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Header If-Match optional 用于确保实际更改的资源和期望更改的资源是一致的,该值来自Create,Get和Update API的响应 string Path functionName required function名称 string Path serviceName required service名称 string Path triggerName required trigger名称 string Body body required 更新字段描述 TriggerUpdateFields Responses HTTP Code Description Schema 200 请求成功 Headers : ETag (string) : trigger etag,用于更改trigger。以确保实际更改的trigger和期望更改的trigger是一致的. TriggerResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 service,function,trigger不存在,错误码:ServiceNotFound,FunctionNotFound,TriggerNotFound Error 409 多个线程同时更新,错误码:ConcurrentUpdateError Error 500 服务内部错误,错误码:InternalServerError Error UpdateAlias PUT /services/{serviceName}/aliases/{aliasName} Description 更新alias Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Header If-Match optional 用于确保实际更改的资源和期望更改的资源是一致的,该值来自Create,Get和Update Alias API的响应 string Path serviceName required service名称 string Path aliasName required alias名称 string Body alias required alias更新对象描述 AliasUpdateFields Responses HTTP Code Description Schema 200 请求成功 Headers : ETag (string) : alias etag,用于更改alias。以确保实际更改的alias和期望更改的alias是一致的. AliasResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 aliase或version不存在,错误码:AliasNotFound,VersionNotFound Error 409 多个线程同时更新,错误码:ConcurrentUpdateError Error 500 服务内部错误,错误码:InternalServerError Error createCustomDomain: POST /custom-domains Request: Type Name Description Schema Header Host(required) 用户 endpoint: $account-id.$region.fc.aliyuncs.com string Body body(required) CustomDomainConfig 对象 CustomDomainConfig Response: HTTP Code Description Schema 200 请求成功 CustomDomainResponse 400 请求无效,错误码:InvalidArgument,LimitExceededError,DomainNameNotResolved Error 403 AccessDenied, InvalidAccessKeyId, SignatureNotMatch Error 409 CustomDomainAlreadyExists Error 500 服务内部错误,错误码:InternalServerError Error updateCustomDomain PUT /custom-domains/{CustomDomain} Request: Type Name Description Schema Header Host(required) 用户 endpoint: $account-id.$region.fc.aliyuncs.com string Path CustomDomain(required) 域名 string Body body(required) CustomDomainConfig 对象 CustomDomainConfig Response: HTTP Code Description Schema 200 请求成功 CustomDomainResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied, InvalidAccessKeyId, SignatureNotMatch Error 404 CustomDomainNotFound Error 409 CustomDomainAlreadyExist, ConcurrentUpdateError Error 500 服务内部错误,错误码:InternalServerError Error getCustomDomain GET /custom-domains/{domainaName} Request: Type Name Description Schema Header Host(required) 用户endpoint: $account-id.$region.fc.aliyuncs.com string Path CustomDomain(required) 域名 string Response: HTTP Code Description Schema 200 请求成功 CustomDomainResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied, InvalidAccessKeyId, SignatureNotMatch Error 404 CustomDomain 不存在,错误码:CustomDomainNotFound Error 500 服务内部错误,错误码:InternalServerError Error listCustomDomain GET /custom-domains Request: Type Name Description Schema Header Host(required) 用户endpoint: $account-id.$region.fc.aliyuncs.com string Query limit(optional) 限定此次返回资源的数量。如果不设定,默认返回20,最大不能超过100。返回结果可能小于指定的数量,但不会多于指定的数量 integer (int32) Query nextToken(optional) 用来返回更多结果。第一次查询不需要提供这个参数,后续查询的token从返回结果中获取。 string Query prefix(optional) 限定返回的资源名称必须以prefix作为前缀。 string Query startKey(optional) 设定结果从 startKey 之后(包括startKey)按字母排序的第一个开始返回 string Response: HTTP Code Description Schema 200 请求成功 CustomDomainResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied, InvalidAccessKeyId, SignatureNotMatch Error 500 服务内部错误,错误码:InternalServerError Error deleteCustomDomain DELETE /custom-domains/{domainaName} Request: Type Name Description Schema Header Host(required) 用户endpoint: $account-id.$region.fc.aliyuncs.com string Path CustomDomain(required) 域名名称 string Response: HTTP Code Description Schema 204 请求成功 No Content 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied, InvalidAccessKeyId, SignatureNotMatch Error 404 CustomDomain 不存在,错误码:CustomDomainNotFound Error 500 服务内部错误,错误码:InternalServerError Error putProvisionConfig: PUT /services/{ServiceName}.{Qualifier}/functions/{FunctionName}/provision-config Request: Type Name Description Schema Header Host(required) 用户 endpoint: $account-id.$region.fc.aliyuncs.com string Header If-Match optional 用于确保实际更改的资源和期望更改的资源是一致的,该值来自Get和Put API的响应 string Path serviceName required service名称 string Path qualifier required alias名称 string Path functionName required function名称 string Body body required put provision target描述 PutProvisionConfigFields Response: HTTP Code Description Schema 200 请求成功 Headers : ETag (string) : provision config etag, 以确保实际更改的provision config和期望更改的provision config是一致的。 ProvisionTargetResponse 400 请求无效,错误码:InvalidArgument Error 403 AccessDenied, InvalidAccessKeyId, SignatureNotMatch Error 412 Etag不匹配,错误码:PreconditionFailed Error 500 服务内部错误,错误码:InternalServerError Error getProvisionConfig GET /services/{ServiceName}.{Qualifier}/functions/{FunctionName}/provision-config Request: Type Name Description Schema Header Host(required) 用户endpoint: $account-id.$region.fc.aliyuncs.com string Path serviceName required service名称 string Path qualifier required alias名称 string Path functionName required function名称 string Response: HTTP Code Description Schema 200 请求成功 Headers : ETag (string) : provision config etag, 以确保实际更改的provision config和期望更改的provision config是一致的。 ProvisionConfigResponse 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied, InvalidAccessKeyId, SignatureNotMatch Error 500 服务内部错误,错误码:InternalServerError Error listProvisionConfigs GET /provision-configs Request: Type Name Description Schema Header Host(required) 用户endpoint: $account-id.$region.fc.aliyuncs.com string Query limit(optional) 限定此次返回资源的数量。如果不设定,默认返回20,最大不能超过100。返回结果可能小于指定的数量,但不会多于指定的数量 integer (int32) Query nextToken(optional) 用来返回更多结果。第一次查询不需要提供这个参数,后续查询的token从返回结果中获取。 string Query serviceName(optional) 限定返回的资源名称必须属于该service。 string Query qualifier(optional) 限定返回的资源名称必须属于该qualifier。qualifier只能是aliasName,且必须和serviceName共同使用 string Response: HTTP Code Description Schema 200 请求成功 Response 200 400 请求无效,错误码:InvalidArgument Error 403 拒绝请求,错误码:AccessDenied, InvalidAccessKeyId, SignatureNotMatch Error 500 服务内部错误,错误码:InternalServerError Error Response 200 Name Schema provisionConfigs optional < ProvisionConfigResponse > array nextToken optional NextToken Definitions Code 支持两种方式提供 code 的 zip 包 指定存储code zip包的ossBucketName和ossObjectName 指定zipFile为zip包的base64编码内容, 在一次请求中必须且只能使用其中的一种。 Name Description Schema ossBucketName optional function code包的bucket name string ossObjectName optional code zip包的object name string zipFile optional 直接在request body中上传code zip包的base64编码 string Error 系统返回的error对象 Name Description Schema errorCode optional 错误码 string errorMessage optional 详细的错误信息描述 string Function Name Description Schema code required 指定code zip包 Code description optional string functionName required function名称 string handler required function执行的入口,具体格式和语言相关 string memorySize optional function的内存规格,单位为MB,最小为128MB,最大1536MB,为64MB的倍数 integer runtime required function的运行环境,目前支持nodejs6, nodejs8, python2.7, python3, java8 string EnvironmentVariables optional 为函数设置的环境变量,可以在函数中获取环境变量的值 map timeout optional function运行的超时时间,单位为秒,最小1秒,最长5分钟,默认3秒。function超过这个时间后会被终止执行 integer initializer optional 初始化 function 执行的入口,具体格式和语言相关 string initializationTimeout optional 初始化 function 运行的超时时间,单位为秒,最小1秒,最长5分钟,默认3秒。初始化 function 超过这个时间后会被终止执行 integer FunctionCodeResponse Name Description Schema checksum optional crc64 checksum Example : "1234567890" string url optional Example : "http://func-code.oss-cn-shanghai.aliyuncs.com/1a2b3c4d5e6f" string FunctionResponse Name Description Schema codeChecksum optional function code包的CRC64值 Example : "5434025278388143772" string codeSize optional 系统返回的function的code包大小,单位为byte Example : 1024 integer (int64) createdTime optional function创建时间 Example : "2016-08-15T15:00:00.000+0000" string description optional Example : "This is a demo hello world function." string functionId optional 系统为每个function生成的唯一ID Example : "2d28e0e9-9ba5-4eed-8b1a-d3d9cd24e737" string functionName optional Example : "helloworld" string handler optional function的执行入口 Example : "hello_world.main" string lastModifiedTime optional function上次修改时间 Example : "2016-08-15T17:00:00.000+0000" string memorySize optional function设置的内存大小,单位为MB Example : 512 integer (int32) runtime optional function运行的语言环境,目前支持nodejs6, nodejs8, python2.7, python3, java8 Example : "nodejs4.4" string EnvironmentVariables optional 为函数设置的环境变量,可以在函数中获取环境变量的值 map timeout optional 运行的超时时间,单位为秒 Example : 10 integer (int32) FunctionUpdateFields function可以更新的字段描述 Name Description Schema code optional 指定code zip包 Code description optional string handler optional function执行的入口,具体格式和语言相关 string memorySize optional function的内存规格,单位为MB,最小为128MB,最大1536MB,为64MB的倍数,默认128MB integer runtime optional function的运行环境,目前支持nodejs6, nodejs8, python2.7, python3, java8 string EnvironmentVariables optional 为函数设置的环境变量,可以在函数中获取环境变量的值 map timeout optional function运行的超时时间,单位为秒,最小1秒,最长5分钟,默认3秒。function超过这个时间后会被终止执行 integer InvokeResponse invoke function返回的结果,函数具体的返回内容由用户解释 Type : binary LogConfig logging 配置 Name Description Schema logstore optional loghub中的logstore名称 string project optional loghub中的project名称 string NextToken 用来返回更多的查询结果。如果这个值没有返回,则说明没有更多结果 Type : string Service service对象描述 Name Description Schema description optional service的简短描述 string internetAccess optional 设为true让function可以访问公网 Example : true boolean logConfig optional log配置,function产生的log会写入这里配置的logstore LogConfig role optional 授予函数计算所需权限的RAM role, 使用场景包含 1. 把 function产生的 log 发送到用户的 logstore 中 2. 为function 在执行中访问其它云资源生成 token Example : "acs:ram::1234567890:role/fc-test" string serviceName required service名称 string vpcConfig optional vpc配置, 配置后function可以访问指定VPC VPCConfig nasConfig optional NAS配置, 配置后function可以访问指定NAS NASConfig ServiceResponse Name Description Schema createdTime optional service的创建时间 Example : "2016-08-15T16:06:05.000+0000" string description optional service的简短描述信息 Example : "This is a demo service." string internetAccess optional 设为true让function可以访问公网 Example : true boolean lastModifiedTime optional service上次更新时间 Example : "2016-08-16T18:00:00.000+0000" string logConfig optional logging 配置,function产生的log会写入这里配置的logstore LogConfig role optional 授予函数计算所需权限的RAM role, 使用场景包含 1. 把 function产生的 log 发送到用户的 logstore 中 2. 为function 在执行中访问其它云资源生成 token Example : "acs:ram::1234567890:role/fc-test" string serviceId optional 系统为每个service生成的唯一ID Example : "2d28e0e9-9ba5-4eed-8b1a-d3d9cd24e737" string serviceName optional Example : "demo-service" string vpcConfig optional vpc配置, 配置后function可以访问指定VPC VPCConfig nasConfig optional NAS配置, 配置后function可以访问指定NAS NASConfig ServiceUpdateFields service可更新字段描述 Name Description Schema description optional string internetAccess optional 设为true让function可以访问公网 Example : true boolean logConfig optional log配置,function产生的log会写入这里配置的logstore LogConfig role optional 授予函数计算所需权限的RAM role, 使用场景包含 1. 把 function产生的 log 发送到用户的 logstore 中 2. 为function 在执行中访问其它云资源生成 token Example : "acs:ram::1234567890:role/fc-test" string vpcConfig optional vpc配置, 配置后function可以访问指定VPC VPCConfig nasConfig optional NAS配置, 配置后function可以访问指定NAS NASConfig Trigger Name Description Schema invocationRole required event source,如OSS,使用该role去invoke function Example : "acs:ram::1234567890:role/fc-test" string sourceArn required event source的Aliyun Resource Name(ARN) Example : "acs:oss:cn-shanghai:12345:mybucket" string triggerConfig required trigger配置,针对不同的trigger类型,trigger配置会有所不同 object triggerName required trigger名称 Example : "image_resize" string triggerType required trigger类型 Example : "oss" string qualifier optional service版本 Example : "LATEST" string TriggerResponse Name Description Schema createdTime optional 创建时间 Example : "2016-08-15T15:00:00.000+0000" string invocationRole optional string lastModifiedTime optional 上次修改时间 Example : "2016-08-15T17:00:00.000+0000" string sourceArn optional string triggerConfig optional object triggerName optional string triggerType optional string qualifier optional string TriggerUpdateFields Name Description Schema invocationRole optional event source,如OSS,使用该role去invoke function Example : "acs:ram::1234567890:role/fc-test" string triggerConfig optional trigger配置,针对不同的trigger类型,trigger配置会有所不同 object qualifier optional service版本 Example : "LATEST" string VPCConfig VPC 配置 Name Description Schema securityGroupId required 安全组ID string vSwitchIds required 一个或多个VSwitch ID < string > array vpcId required VPC ID string NASConfig NAS 配置 Name Description Schema userId required userID string groupId required groupID string mountPoints required 挂载点 < MountPoint > array MountPoint 挂载点 Name Description Schema serverAddr required NAS 服务器地址 string mountDir required 本地挂载目录 string CustomDomainConfig 对象描述 Name Description Schema DomainName(required) 域名 string Protocol(required) HTTP 或 HTTP,HTTPS string ApiVersion(optional) api_version string RouteConfig(optional) 路由表:自定义域名访问时的 path 到 function 的映射 RouteConfig CertConfig(optional) https证书信息 CertConfig RouteConfig 对象描述 Name Description Schema Routes(required) 是路由的数组 PathConfig Array PathConfig 对象描述 Name Description Schema path(required) 自定义域名 request 的路径,例如:”/login/*” string serviceName(required) path 对应的 function 所在的 service,例如:”blogService” string functionName(required) path 对应的 function ,例如:”login” string CertConfig 对象描述 Name Description Schema certName(required) 证书的自定义名字 string privateKey(required) 私钥 string certificate(required) 证书 string CustomDomainResponse 对象描述 Name Description Schema CreatedTime 绑定域名的时间 string LastModifiedTime 更新域名信息的时间 string CustomDomain 用户域名 string Protocol 协议类型 string ApiVersion api 版本 string RouteConfig 路由表配置 RouteConfig CertConfig(optional) https证书信息 CertConfig Version Name Description Schema versionId required service版本号 Example : "1" string description optional service版本描述 Example : "my service version" string VersionResponse Name Description Schema createdTime optional 创建时间 Example : "2016-08-15T15:00:00.000+0000" string lastModifiedTime optional 上次修改时间 Example : "2016-08-15T17:00:00.000+0000" string versionId optional string description optional string Alias Name Description Schema aliasName required service版本别名 Example : "my-alias" string versionId required alias指向的版本 Example : "1" string description optional alias的描述 object additionalVersionWeight optional 灰度发布的版本,以及对应的流量权重 Example : "2:0.05" map AliasResponse Name Description Schema createdTime required 创建时间 Example : "2016-08-15T15:00:00.000+0000" string lastModifiedTime required 上次修改时间 Example : "2016-08-15T17:00:00.000+0000" string aliasName required string versionId required string description optional string additionalVersionWeight optional map AliasUpdateFields Name Description Schema versionID required alias指向的版本 Example : "1" string description optional alias的描述 object additionalVersionWeight optional 灰度发布的版本,以及对应的流量权重 Example : "2:0.05" map PutProvisionConfigFields Name Description Schema target required 目标资源个数 Example : "1" integer (int64) ProvisionTargetResponse Name Description Schema resource required 资源描述 Example : "12345#servierName#qualifier#functionName" string target required 目标资源个数 Example : "1" integer (int64) ProvisionConfigResponse Name Description Schema resource required 资源描述 Example : "12345#servierName#qualifier#functionName" string target required 目标资源个数 Example : "1" integer (int64) current required 实际资源个数 Example : "1" integer (int64) TagResource POST /tag Description 给资源打标签 Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Body body required tagResourceBody json Responses HTTP Code Description Schema 200 给指定的资源打标签成功 无 400 请求无效,错误码: InvalidArgument Error 403 拒绝请求,错误码: AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 资源不存在,错误码: ServiceNotFound Error 500 服务内部错误,错误码: InternalServerError Error tagResourceBody Argument Type Required Description resourceArn string yes Resource ARN. ARN 全称或者简称 tags string to string map yes tag 字典, length 至少为 1, 最大为 20 注:目前只能给 top level 资源 service 进行标签的相关操作, ARN 可以是类似 services/foo 或者 acs:fc:cn-shanghai:123456789:services/foo UntagResource DELETE /tag Description 给资源取消标签 Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Body body required unTagResourceBody json Responses HTTP Code Description Schema 200 取消指定资源标签成功 无 400 请求无效,错误码: InvalidArgument Error 403 拒绝请求,错误码: AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 资源不存在,错误码: ServiceNotFound Error 500 服务内部错误,错误码: InternalServerError Error unTagResourceBody Argument Type Required Description resourceArn string yes Resource ARN. ARN 全称或者简称 tagKeys string array no tag key 值列表, 最大为20,当 all=false, length 至少为 1. 当 length 大于 1 时, 可以忽略 all 值 all bool no 删除所有 tag,默认值为 false GetResourceTags GET /tag Description 获取资源所有的标签信息 Parameters Type Name Description Schema Header Host required 访问域名:$account-id.$region.fc.aliyuncs.com string Query resourceArn required Resource ARN. ARN 全称或者简称 string Responses HTTP Code Description Schema 200 获取指定资源标签成功 GetResourceTagsResponse 400 请求无效,错误码: InvalidArgument Error 403 拒绝请求,错误码: AccessDenied,InvalidAccessKeyId,SignatureNotMatch,RequestTimeTooSkewed Error 404 资源不存在,错误码: ServiceNotFound Error 500 服务内部错误,错误码: InternalServerError Error GetResourceTagsResponse Argument Type Description resourceArn string Resource ARN 全称 tags string to string map tag 字典

1934890530796658 2020-03-27 17:57:19 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播