精华内容
下载资源
问答
  • 本关任务使用函数 AVG() 计算数据表中指定字段的平均值。 相关知识 为了完成本关任务,你需要掌握:1. AVG() 函数的含义,2. AVG() 函数的用法。 返回某一字段的平均值 AVG() 函数通过计算某字段(列)内容(行)...

    第1关:AVG() 函数的使用
    任务描述
    本关任务:使用函数 AVG() 计算数据表中指定字段的平均值。
    相关知识
    为了完成本关任务,你需要掌握:1. AVG() 函数的含义,2. AVG() 函数的用法。
    返回某一字段的平均值
    AVG() 函数通过计算某字段(列)内容(行)的个数和它们的数值之和来返回某一字段的平均值。
    语法规则为:
    SELECT AVG(column_name)
    FROM table_name
    举个例子
    我们想从表 Customers 中,检索到所有消费者消费金额的平均值。
    表 Customers 的内容如下表所示:
    在这里插入图片描述
    输入:
    SELECT AVG(cost) as avg_cost
    FROM Customers
    输出:
    | | avg_cost |
    | ———— |
    | 1 | 2415.26 |
    在这个例子里, SELECT 语句只负责返回一个值,这个值就是 avg_cost 。 avg_cost 是我们为检索数据起的“小名”,它包含着所有消费者消费金额的平均值。
    Tips:
    如果你没有为你的检索结果起个“小名”, 那它就只能是供你观赏的一个值,在接下来的操作中,你将不能继续使用它。所以为了以防万一,好的习惯是为自己每一个检索结果,都起一个有意义的名字,好看又好记。
    返回某一字段指定内容的平均值
    AVG() 函数不仅能计算某字段(列)的平均值,如果你愿意,还能为 SELECT 语句增加条件,以此来计算某些特定条件下某字段的平均值。
    举个例子
    我们想从表 Customers 中,检索到所有叫 Alice 的消费者消费金额的平均值。表 Customers 的内容与上例一致。
    输入:
    SELECT AVG(cost) as avg_alice_cost
    FROM Customers
    WHERE cust_name LIKE ‘Alice%’
    与上例不同的是,我们在这里加入了条件筛选语句 WHERE。WHERE 语句帮我们过滤了所有不叫 Alice 的人,因此,我们所查到的消费金额平均值是所有叫 Alice 的人的消费平均值。
    编程要求
    我们已经为你建好了数据库与数据表,并添加了相应的数据内容。你只需补全右侧代码片段中 Begin-End 区间的代码,返回表 Products 中商品价格( prod_price )大于平均值的商品的 prod_name 和 prod_price。
    其中表 Products 的内容如下表所示:
    在这里插入图片描述
    提示:
    与本关例子不同的是,在练习中需要你们返回的是 prod_name 和 prod_price,而不是平均值;
    与本关例子不同的是,在练习中需要你们设置的过滤条件是平均值;
    SELECT 语句是可以嵌套使用的,比如有如下形式的代码:
    SELECT column_A
    FROM table
    WHERE column_A < (SELECT column_B FROM table)
    测试说明
    测试过程:
    本关涉及到的测试文件是 step1_test.sh,平台将运行用户补全的 step1.sql 文件,得到数据;
    将得到的数据与答案比较,判断代码是否正确。
    如果操作正确,你将得到如下的结果:
    在这里插入图片描述
    参考代码:

    USE Mall
    GO
    SET NOCOUNT ON
    ------ return two columns that the price bigger than average price ------
    -- ********** Begin ********** --
    SELECT  prod_name,prod_price
    FROM Products
    WHERE prod_price>(SELECT AVG (prod_price) FROM Products)
    -- ********** End ********** --
    GO
    

    第2关:COUNT() 函数的使用
    任务描述
    本关任务:使用函数 COUNT(),计算数据表中指定字段(列)的内容(行)个数。
    相关知识
    为了完成本关任务,你需要掌握:1. COUNT() 函数的含义,2. COUNT() 函数的用法。
    返回内容(行)的个数
    COUNT() 函数的作用就像它的函数名一样能让大家一目了然,没错,它就是用来计数的。
    COUNT() 函数有两种使用方法:
    使用 COUNT() 能对整张表的内容(行)进行计数,不管内容(行)是有值还是空值。
    使用 COUNT(字段) 能对某一字段的内容(行)进行计数,但是会忽略 NULL 值。
    语法规则为:
    1.
    SELECT COUNT(
    )
    FROM 表名
    2.
    SELECT COUNT(字段名)
    FROM 表名
    举个例子
    我们想从表 Customers 中,检索到整张表一共有多少内容(行)。
    表 Customers 的内容如下图所示:
    在这里插入图片描述
    输入:
    SELECT COUNT() AS nums
    FROM Customers
    输出:
    在这里插入图片描述
    检索过程为:
    在这里插入图片描述
    在这个例子里, COUNT(
    ) 用来对整张表的内容(行)进行计数,忽略了内容是否为空值。计数的结果最后返回到了 nums 。
    再举个例子
    我们想从表 Customers 中,检索到究竟有多少人拥有邮箱地址。表 Customers 的内容与上例一致。
    输入:
    SELECT COUNT(cust_email) AS nums
    FROM Customers
    输出:
    在这里插入图片描述
    检索过程为:
    在这里插入图片描述
    SELECT 语句使用了 COUNT(cust_email) 来对 cust_email 字段下的非空值进行计数。在这个例子中,我们看到有五分之四的人拥有自己的邮箱。
    Tips:
    当我们指定对某一个字段(列)进行计数时,COUNT() 就会忽略 NULL 对非空值进行计数。但是如果没有指定字段(列),使用 COUNT(*) 对整体内容(行)进行计数,计数就会包含空值行。这点要时刻保持清醒!
    编程要求
    我们已经为你建好了数据库与数据表,并添加了相应的数据内容。你只需补全右侧代码片段中 Begin-End 区间的代码,返回表 Products 中商品价格( prod_price )大于 10 的商品个数(只需返回数量即可)。
    其中表 Products 的内容不公开,但是已知每个产品的价格非空。期待你的发挥!
    测试说明
    测试过程:
    本关涉及到的测试文件是 step2_test.sh ,平台将运行用户补全的 step2.sql 文件,得到数据;
    将得到的数据与答案比较,判断代码是否正确。
    如果操作正确,你将得到如下的结果:
    在这里插入图片描述
    参考代码:

    USE Mall
    GO
    SET NOCOUNT ON
    ------ return the number of product which price bigger than 10 -----
    -- ********** Begin ********** --
    SELECT COUNT(prod_price) 
    FROM Products
    WHERE prod_price>10
    -- ********** End ********** --
    GO
    

    第3关:MAX() 函数和 MIN() 函数的使用
    任务描述
    本关任务:1. 使用函数 MAX() 计算数据表中指定字段的最大值;2. 使用函数 MIN() 计算数据表中指定字段的最小值。
    相关知识
    为了完成本关任务,你需要掌握:
    MAX() 函数的含义;
    MAX() 函数的用法;
    MIN() 函数的含义;
    MIN() 函数的用法。
    MAX() 函数的使用
    MAX() 函数能够返回某一字段(列)的最大值。值得注意的是,要想使用 MAX() 函数,就一定需要有特定的字段(列)与之配对,不能偷懒用通配符 * 作参数。
    语法规则为:
    SELECT MAX(字段名)
    FROM 表名
    举个例子
    我们想从表 Customers 中,检索到所有消费者消费金额的最高值。
    表 Customers 的内容如下图所示:
    在这里插入图片描述
    输入:
    SELECT MAX(cost) as max_cost
    FROM Customers
    输出:
    在这里插入图片描述
    Tips:
    虽然 MAX() 函数经常用于寻找最大的数值型数字,但是有些(不是所有)数据库管理系统允许将 MAX() 函数用于字符型数据。当用于字符型数据时, MAX() 函数将会为我们返回 某字段(列) 的最后一个数据内容。
    比如如下检索过程:
    在这里插入图片描述
    字段(列)cust_email 存储的是字符型数据,却能用来返回该字段最后一个数据内容。
    Tips:
    MAX() 函数会直接忽略在检索过程中碰见的空值 NULL。
    MIN 函数的使用
    与 MAX() 函数相反,MIN() 函数能够返回某一字段(列)的最小值。
    语法规则为:
    SELECT MIN(字段名)
    FROM 表名
    Tips:
    虽然 MIN() 函数经常用于寻找最小的数值型数字,但是有些(不是所有)数据库管理系统允许将 MIN() 函数用于字符型数据。当用于字符型数据时,MIN() 函数将会为我们返回某字段(列)的第一个数据内容。
    Tips:
    MIN() 函数同样也会直接忽略在检索过程中碰见的空值 NULL 。
    MIN() 函数就讲这么多了,没有例子?剩下的需要你们亲自来完成。
    编程要求
    我们已经为你建好了数据库与数据表,并添加了相应的数据内容。你只需补全右侧代码片段中 Begin-End 区间的代码,返回表 Products 中商品价格( prod_price )最小的商品的 prod_name 和 prod_price。
    其中表 Products 的内容不公开,但是已知每个产品的价格非空。
    提示:
    与本关例子不同的是,在练习中需要你们返回的是 prod_name 和 prod_price,而不是最小值;
    与本关例子不同的是,在练习中需要你们设置的过滤条件是最小值。
    SELECT 语句是可以嵌套使用的,比如有如下形式的代码:
    SELECT column_A
    FROM table
    WHERE column_A = (SELECT column_B FROM table)
    期待你的发挥!
    测试说明
    测试过程:
    本关涉及到的测试文件是 step3_test.sh,平台将运行用户补全的 step3.sql 文件,得到数据;
    将得到的数据与答案比较,判断代码是否正确。
    如果操作正确,你将得到如下的结果:
    在这里插入图片描述
    参考代码:

    USE Mall
    GO
    SET NOCOUNT ON
    ------ return the price of the least expensive item ------
    -- ********** Begin ********** --
    SELECT  prod_name,prod_price
    FROM Products
    WHERE prod_price=(SELECT MIN (prod_price) FROM Products)
    -- ********** End ********** --
    GO
    

    第4关:SUM() 函数的使用
    任务描述
    本关任务:使用函数 SUM(),计算数据表中指定字段的数值之和。
    相关知识
    为了完成本关任务,你需要掌握:1. SUM() 函数的含义,2. SUM() 函数的用法。
    返回某一字段的数值之和
    SUM() 是用来返回某一字段(列)数值总和的函数,初学的学习者很容易把它和 COUNT() 函数搞混。
    因为在某个条件下,他们返回的是相同的值。比如,在你要统计的字段的内容(行) 都为 1 时,不管你是进行计数还是加和,结果都是相同的。
    在这里插入图片描述
    但是只要记住,COUNT() 函数只能用来计数就可以了,就像数鸭子一样。
    下面,我们来看看如何使用 SUM() 函数。
    语法规则为:
    SELECT SUM(字段名)
    FROM 表名
    举个例子
    我们想从表 Customers 中,检索所有消费者消费金额的总和。
    表 Customers 的内容如下图所示:
    在这里插入图片描述
    输入:
    SELECT SUM(cost) as total
    FROM Customers
    输出:
    在这里插入图片描述
    在这个例子中,SUM(cost) 函数为我们返回了 cost 字段中所有内容的加和,非常方便。
    返回某一字段经过计算后的数值之和
    你以为 SUM() 函数只能这么用吗?它还有更棒的地方,我们还可以在函数内做你喜欢的计算,说起来,它就是数学中的∑符号。
    举个例子
    如果商场决定为每一位顾客打八折,那商场在原基础上将会损失多少营业额呢?
    表 Customers 的内容与上例相同。
    编程要求
    我们已经为你建好了数据库与数据表,并添加了相应的数据内容。
    你只需:
    补全右侧代码片段中 Begin-End 区间的代码,这次我们在表 Products 中增加了 quantity(数量)字段,请返回所有商品的价格与数量乘积的总和(即总库存的金额),并命名它为 amount。
    其中表 Products 的内容如下表所示:
    在这里插入图片描述
    测试说明
    本关涉及到的测试文件是 step4_test.sh ,平台将运行用户补全的 step4.sql 文件,得到数据;
    将得到的数据与答案比较,判断代码是否正确。
    如果操作正确,你将得到如下的结果:
    在这里插入图片描述
    参考代码:

    USE Mall
    GO
    SET NOCOUNT ON
    ------ return the amount of all products ------
    -- ********** Begin ********** --
    SELECT SUM(prod_price * quantity) as amount
    FROM products
    -- ********** End ********** --
    GO
    
    展开全文
  • HiveSQL函数优化原理

    2021-01-21 10:28:05
    可以看到,group by本身不是全局变量,任务会被分到各个map中进行分组,然后再在reduce中聚合。 默认设置了hive.map.aggr=true,所以会在mapper端先group by一次,最后再把结果merge起来,为了减少reducer处理的...

    更多内容,欢迎观众公众号:livandata

    1、group by的计算原理:

    代码为:SELECT uid, SUM(COUNT) FROM logs GROUP BY uid;

     

    可以看到,group by本身不是全局变量,任务会被分到各个map中进行分组,然后再在reduce中聚合。

    默认设置了hive.map.aggr=true,所以会在mapper端先group by一次,最后再把结果merge起来,为了减少reducer处理的数据量。注意看explain的mode是不一样的。mapper是hash,reducer是mergepartial。如果把hive.map.aggr=false,那将groupby放到reducer才做,他的mode是complete。

    优化点:

    Group by主要是面对数据倾斜的问题。

    很多聚合操作可以现在map端进行,最后在Reduce端完成结果输出。

    Set hive.map.aggr = true 是否在Map端进行聚合,默认为true;

    Set hive.groupby.mapaggr.checkinterval=1000000 在Map端进行聚合操作的条目数目;

    当使用Groupby有数据倾斜的时候进行负载均衡:

    Set hive.groupby.skewindata=true;hive自动进行负载均衡;

    策略就是把MR任务拆分成两个MR Job:第一个先做预汇总,第二个再做最终汇总;

    第一个Job:

    Map输出结果集中缓存到maptask中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同Group by Key有可能被分到不同的reduce中,从而达到负载均衡的目的;

    第二个Job:

    根据第一阶段处理的数据结果按照group by key分布到reduce中,保证相同的group by key分布到同一个reduce中,最后完成最终的聚合操作。

    2、join的计算原理:

    代码为:SELECT a.id,a.dept,b.age FROM a join b ON (a.id = b.id);

     

    1)Map阶段:

    读取源表的数据,Map输出时候以Join on条件中的列为key,如果Join有多个关联键,则以这些关联键的组合作为key;

    Map输出的value为join之后所关心的(select或者where中需要用到的)列;同时在value中还会包含表的Tag信息,用于标明此value对应哪个表;

    按照key进行排序;

    2)Shuffle阶段:

    根据key的值进行hash,并将key/value按照hash值推送至不同的reduce中,这样确保两个表中相同的key位于同一个reduce中

    3)Reduce阶段:

    根据key的值完成join操作,期间通过Tag来识别不同表中的数据。

    在多表join关联时:

    如果 Join 的 key 相同,不管有多少个表,都会则会合并为一个 Map-Reduce,例如:

    SELECT pv.pageid, u.age FROM page_view p JOIN user u ON (pv.userid = u.userid) JOIN newuser x ON (u.userid = x.userid);

    如果 Join 的 key 不同,Map-Reduce 的任务数目和 Join 操作的数目是对应的,例如:

    SELECT pv.pageid, u.age FROM page_view p JOIN user u ON (pv.userid = u.userid) JOIN newuser x on (u.age = x.age);

    优化点:

    1)应该将条目少的表/子查询放在 Join 操作符的左边。

    2)我们知道文件数目小,容易在文件存储端造成瓶颈,给 HDFS 带来压力,影响处理效率。对此,可以通过合并Map和Reduce的结果文件来消除这样的影响。

    用于设置合并属性的参数有:

    是否合并Map输出文件:hive.merge.mapfiles=true(默认值为真)

    是否合并Reduce 端输出文件:hive.merge.mapredfiles=false(默认值为假)

    合并文件的大小:hive.merge.size.per.task=256*1000*1000(默认值为 256000000)

    3)Common join即普通的join,性能较差,因为涉及到了shuffle的过程(Hadoop/spark开发的过程中,有一个原则:能避免不使用shuffle就不使用shuffle),可以转化成map join。

    hive.auto.convert.join=true;表示将运算转化成map join方式,使用的前提条件是需要的数据在 Map 的过程中可以访问到。

    运算图为:

    1)启动Task A:Task A去启动一个MapReduce的local task;通过该local task把small table data的数据读取进来;之后会生成一个HashTable Files;之后将该文件加载到分布式缓存(Distributed Cache)中来;

    2)启动MapJoin Task:去读大表的数据,每读一个就会去和Distributed Cache中的数据去关联一次,关联上后进行输出。

    整个阶段,没有reduce 和 shuffle,问题在于如果小表过大,可能会出现OOM。

    3、Union与union all优化:

    union将多个结果集合并为一个结果集,结果集去重。代码为:

    select id,name from t1 union select id,name from t2 union select id,name from t3

    对应的运行逻辑为:

     

    union all将多个结果集合并为一个结果集,结果集不去重。使用时多与group by结合使用,代码为:

    select all.id, all.name from(select id,name from t1 union all select id,name from t2 union all select id,name from t3)all group by all.id ,all.name

    对应的运行逻辑为:

     

    从上面的两个逻辑图可以看到,第二种写法性能要好。union写法每两份数据都要先合并去重一次,再和另一份数据合并去重,会产生较多次的reduce。第二种写法直接将所有数据合并再一次性去重。

    对union all的操作除了与group by结合使用还有一些细节需要注意:

    1)对 union all 优化只局限于非嵌套查询。

    原代码:job有3个

    SELECT * FROM
    
    (SELECT * FROM t1 GROUP BY c1,c2,c3 UNION ALL SELECT * FROM t2 GROUP BY c1,c2,c3)t3
    
    GROUP BY c1,c2,c3

    这样的结构是不对的,应该修改为:job有1个

    SELECT * FROM (SELECT * FROM t1 UNION ALL SELECT * FROM t2)t3 GROUP BY c1,c2,c3

    这样的修改可以减少job数量,进而提高效率。

    2)语句中出现count(distinct …)结构时:

    原代码为:

    SELECT * FROM
    
    (
    
    SELECT * FROM t1
    
    UNION ALL
    
    SELECT c1,c2,c3 COUNT(DISTINCT c4) FROM t2 GROUP BY c1,c2,c3
    
    ) t3
    
    GROUP BY c1,c2,c3;

    修改为:(采用临时表消灭 COUNT(DISTINCT)作业不但能解决倾斜问题,还能有效减少jobs)

    INSERT t4 SELECT c1,c2,c3,c4 FROM t2 GROUP BY c1,c2,c3;
    
    SELECT c1,c2,c3,SUM(income),SUM(uv) FROM
    
    (
    
    SELECT c1,c2,c3,income,0 AS uv FROM t1
    
    UNION ALL
    
    SELECT c1,c2,c3,0 AS income,1 AS uv FROM t2
    
    ) t3
    
    GROUP BY c1,c2,c3;

    4、Order by的优化:

    如果指定了hive.mapred.mode=strict(默认值是nonstrict),这时就必须指定limit 来限制输出条数,原因是:所有的数据都会在同一个reducer端进行,数据量大的情况下可能不能出结果,那么在这样的严格模式下,必须指定输出的条数。

    所以数据量大的时候能不用order by就不用,可以使用sort by结合distribute by来进行实现。sort by是局部排序;

    distribute by是控制map怎么划分reducer。

    cluster by=distribute by + sort by

    被distribute by设定的字段为KEY,数据会被HASH分发到不同的reducer机器上,然后sort by会对同一个reducer机器上的每组数据进行局部排序。

     

     

    例如:

    select mid, money, name from store cluster by mid
    
    select mid, money, name from store distribute by mid sort by mid

    如果需要获得与上面的中语句一样的效果:

    select mid, money, name from store cluster by mid sort by money

    注意被cluster by指定的列只能是降序,不能指定asc和desc。

    不过即使是先distribute by然后sort by这样的操作,如果某个分组数据太大也会超出reduce节点的存储限制,常常会出现137内存溢出的错误,对大数据量的排序都是应该避免的。

    5、Count(distinct …)优化

    如下的sql会存在性能问题:

    SELECT COUNT( DISTINCT id ) FROM TABLE_NAME WHERE ...;

    主要原因是COUNT这种“全聚合(full aggregates)”计算时,它会忽略用户指定的Reduce Task数,而强制使用1,这会导致最终Map的全部输出由单个的ReduceTask处理。这唯一的Reduce Task需要Shuffle大量的数据,并且进行排序聚合等处理,这使得它成为整个作业的IO和运算瓶颈。

    图形如下:

     

    为了避免这一结构,我们采用嵌套的方式优化sql:

    SELECT COUNT(*) FROM (SELECT DISTINCT id FROM TABLE_NAME WHERE … ) t;

    这一结构会将任务切分成两个,第一个任务重借用多个reduce实现distinct去重并进行初步count计算,然后再将计算结果输出到第二个任务中进行计数。

     

    另外,再有的方法就是用group by()嵌套代替count(distinct a)。

    如果能用group by的就尽量使用group by,因为group by性能比distinct更好。

    HiveSQL细节优化:

    1)设置合理的mapreduce的task数,能有效提升性能。

    set mapred.reduce.tasks=n

    2)在sql中or的用法需要加括号,否则可能引起无分区限制:

    Select x from t where ds=d1 and (province=’gd’ or province=’gx’)

    3)对运算结果进行压缩:

    set hive.exec.compress.output=true;

    4)减少生成的mapreduce步骤:

    4.1)使用CASE…WHEN…代替子查询;

    4.2)尽量尽早地过滤数据,减少每个阶段的数据量,对于分区表要加分区,同时只选择需要使用到的字段;

    5)在map阶段读取数据前,FileInputFormat会将输入文件分割成split。split的个数决定了map的个数。

    mapreduce.input.fileinputformat.split.minsize 默认值 0

    mapreduce.input.fileinputformat.split.maxsize 默认值 Integer.MAX_VALUE

    dfs.blockSize 默认值 128M

    所以在默认情况下 map的数量=block数

    6)常用的参数:

    hive.exec.reducers.bytes.per.reducer=1000000设置每个reduce处理的数据量,reduce个数=map端输出数据总量/参数;

    set hive.mapred.mode=nonstrict;

    set hive.exec.dynamic.partition=true;

    set hive.exec.dynamic.partition.mode=nonstrict;

    set mapred.job.name=p_${v_date};

    set mapred.job.priority=HIGH;

    set hive.groupby.skewindata=true;

    set hive.merge.mapredfiles=true;

    set hive.exec.compress.output=true;

    set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec;

    set mapred.output.compression.type=BLOCK;

    set mapreduce.map.memory.mb=4096;

    set mapreduce.reduce.memory.mb=4096;

    set hive.hadoop.supports.splittable.combineinputformat=true;

    set mapred.max.split.size=16000000;

    set mapred.min.split.size.per.node=16000000;

    set mapred.min.split.size.per.rack=16000000;

    set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;

    set hive.exec.reducers.bytes.per.reducer=128000000;

    7)设置map个数:
    map个数和来源表文件压缩格式有关,.gz格式的压缩文件无法切分,每个文件会生成一个map;

    set hive.hadoop.supports.splittable.combineinputformat=true; 只有这个参数打开,下面的3个参数才能生效
    set mapred.max.split.size=16000000; 每个map负载;

    set mapred.min.split.size.per.node=100000000; 每个节点map的最小负载,这个值必须小于set mapred.max.split.size的值;

    set mapred.min.split.size.per.rack=100000000; 每个机架map的最小负载;

    set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;  

     

    展开全文
  • 客户端示例客户端使用的 是php 写的交互式客户端 可以看到任务分配的非常平均 6 进程 每个进程分配3.4748 万个任务 平均9/S 9个任务每秒任务是远程下载国外亚马逊的图片使用方法 以及函数说明/*** WeiCot Sp ...

    客户端

    示例

    客户端使用的 是php 写的交互式客户端 可以看到任务分配的非常平均 6 进程 每个进程分配3.4748 万个任务 平均9/S 9个任务每秒

    任务是远程下载国外亚马逊的图片

    使用方法 以及函数说明

    /**

    * WeiCot Sp Framework

    * User: ajiang

    * Date: 2017/6/17 0016

    * Time: 16:37

    */

    include_once "Bootstrap.php";

    include_once "TaskConfig.php";

    use Weicot\Mysql;

    use Weicot\Spider\Collection;

    use Weicot\Spider\TaskTable;

    $Collection = new Collection;

    $db = new Mysql;

    $taskTable = new TaskTable;

    $taskTable->prinInfo = true; //打印信息

    $taskTable->longLogShow = false; //输出长日志

    $taskTable->debugScript = true; //输出执行脚本

    $taskTable->filterTaskTableStatus = $runStatus; //筛选任务状态

    $taskTable->oriTable = $oriTable; //源表

    $taskTable->ini($runIni); //导入配置文件

    $taskTable->setServiceGrop($totalServiceAutomatic); //设置服务器组

    //本表的操作 自动分配 自动运行 自动采集

    /*

    $taskTable->setSwitchModeStatus("importData","Y"); //导入数据

    $taskTable->setSwitchModeStatus("spiderBeg","Y"); //开始爬取

    $taskTable->setSwitchModeStatus("syncOri","N"); //同步源表

    $taskTable->automaticallyAssignRunTasks($runAutomaticallyAssignRunTasksWhere); //自动添加 分配任务 并运行脚本

    */

    //采集自动采集 剩下的数据

    //$taskTable->addIndex(); //给task_table figId 添加索引

    $taskTable->setSwitchModeStatus("importData", "N"); //导入数据

    $taskTable->setSwitchModeStatus("spiderBeg", "Y"); //开始爬取

    $taskTable->setSwitchModeStatus("syncOri", "N"); //同步源表

    $taskTable->runLocalTask(); //运行本地 剩下的任务

    $taskTable->getStatisticalInfo(); //获得统计信息

    //一些其它的常用函数

    /*

    $taskTable->assignAddTask($count,$totalServiceAutomatic); //根据数量分配任务

    $taskTable->addIndex("ASIN","product_amz"); //给指定表 指定字段添加索引

    $taskTable->addIndex() //给task_table figId 添加索引

    $taskTable->dropTable(); //清除表

    $taskTable->createTable(); //创建表

    $taskTable->runScript(); //运行多任务脚本

    $taskTable->assignTask($totalServiceAutomatic); //分配服务器

    $taskTable->removeDuplicates(); //清除表中重复数据

    $taskTable->getStatisticalInfo(); //获得统计信息

    $taskTable->resetValue($key, $resetValue, $where); //重置表中 Key

    */

    //TaskTable Class

    //TaskTable 变量

    $taskTable->db = ""; //数据库

    $taskTable->service = ""; //服务ID

    $taskTable->grop = ""; //任务组

    $taskTable->prinInfo = true; //打印信息

    $taskTable->savePath; //保存的路径

    $taskTable->longLogShow = true; //控制长日志是否显示

    $taskTable->runScriptGrop; //运行一组脚本 这里是指脚本内容

    $taskTable->totalServiceAutomatic; //需要分配的服务器 自动分配

    $taskTable->basePath; //基本路径

    $taskTable->filterTaskTableStatus; //筛选 指定状态的任务

    $taskTable->oriTable; //源表

    $taskTable->register; //内存寄存器

    $taskTable->registerService = "127.0.0.1"; //寄存器地址

    $taskTable->registerPort = "6379"; //寄存器端口

    $taskTable->enabledRegister = true; //启用寄存器

    $taskTable->debugScript = false; //dedBug 脚本

    //TaskTable 函数列表

    $taskTable->ini($ini); // 初始化配置

    $taskTable->createTable(); // 创建任务表

    $taskTable->dropTable(); //删除任务表

    $taskTable->addTask($figId, $url, $description = ""); //添加任务

    $taskTable->delTask($id, $figId = false); // 删除任务 可以使用 fig id 或 id

    $taskTable->removeDuplicates($deleteOnlyDuplicateInGroup = false); //去除重复 大于等于2 只留一条数据 $deleteOnlyDuplicateInGroup 仅删除组中的重复

    $taskTable->removeOriTableDuplicates($table, $key); //清除 源表的重复数据

    $taskTable->getTaskList($limit = "0,2000", $status = "P", $grop = false); //获得任务列表 status null 未采集 F 采集失败 Y 采集陈功 P 采集中

    $taskTable->getTaskWithSql($sql); //通过自定义SQL 获得任务列表

    $taskTable->toArray(); //任务列表 输出为数组

    $taskTable->toText($filePath = false); //任务输出到文本

    $taskTable->getTaskInfo($id, $key, $fagid = false); //获得任务信息

    $taskTable->upInfo($key, $value, $id, $fagid = false); //更新信息

    $taskTable->translationStatus($status); //翻译状态

    $taskTable->upTaskStatus($figId, $status = "P"); // 更新任务状态

    $taskTable->syncOriTable($table, $set, $where, $figId = false); //同步数据源表

    $taskTable->upSyncTime($figId); //同步任务表中 远程同步时间

    $taskTable->addIndex($keyName = "figId", $tableName = "task_list"); //添加索引

    $taskTable->getStatusTotal($status, $serviceId = "*"); //获得各种状态的合计数量

    $taskTable->syncTotal($service = "*"); // 已经 同步过去的数量

    $taskTable->printTaskInfo($info); //输出错误信息 服务器端

    $taskTable->clientPrint($info); //客户端打印 输出

    $taskTable->echoStatus($status, $serviceId); //输出状态

    $taskTable->getOriTableTotal(); //获得源表数量

    $taskTable->getStatisticalInfo(); //获得统计信息

    $taskTable->statisticalSqlData($select); //获得统计 SQl 的记录

    $taskTable->assignTask($service, $rule = false, $automatic = true); //自动分配任务

    $taskTable->assignAddTask($count, $service = array()); // 根据任务数量进行分配任务 count $Service=array(1,2,3) 添加任务分配

    $taskTable->runScriptFile($file = "MainSpScript.php"); //运行多任务脚本

    $taskTable->setRunScripGrop($scriptGrop); //设置要运行的多任务脚本

    $taskTable->runScript(); //运行自动化的多任务脚本

    $taskTable->setServiceGrop($serviceGrop); //设置服务器组

    $taskTable->runMainScript(); //运行主脚本

    $taskTable->automaticallyAssignRunTasks($where); //自动分配 并运行任务 where 条件

    $taskTable->runLocalTask($limit = "0,10000"); //运行本地任务

    $taskTable->resetValue($key, $resetValue, $where); //重置 源表的某个 key

    $taskTable->getRegisterValue($key); //获得寄存器的值 支持分组

    $taskTable->setRegister($key, $value); // 设置寄存器的值 支持分组

    $taskTable->getSwitchStatus($Switch); //获得开关 importData 导入数据 spiderBeg 开始爬取 syncOri 同步 Y 打开 N 关闭

    $taskTable->setSwitchModeStatus($switch, $status = "Y"); //设置选择

    ............................. 剩下的一些任务规划 动态表 的函数就不贴了 内部公告有

    帮助信息 本来输出是有带颜色的 奈何 这WIN CDM 不支持

    C:\Users\Administrator>php G:\SP2\TableTaskClient.php

    Weicot Spider v0.12 Task Table Command Line

    ◥◣    ◢◤     ◥◣

    ◤        ◥◣  ◢◤       █...

    ▎   ◢█◣   ◥◣◢◤   ◢█   █

    ◣  ◢◤  ◥◣       ◢◣◥◣ ◢◤.

    ◥██◤  ◢◤         ◥◣

    █ ●       ● █

    █ 〃   ▄   〃 █

    ◥◣   ╚╩╝   ◢◤

    ◥█▅▃▃ ▃▃▅█◤

    ◢◤   ◥◣

    █     █

    ◢◤▕   ▎◥◣

    ▕▃◣◢▅▅▅◣◢▃ WeiCot Tools Command

    WebSite wwww.weicot.com ajing 1050653098@qq.com

    Help Command help

    [11:02:03|Task Table#]help

    <========WeiCot Cli V0.23========>

    Command Description

    help 获得帮助

    statistical 获得统计信息

    removeDuplicates 清除表中重复数据

    runScript 运行多任务脚本

    dropTable 删除任务表

    createTable 创建任务表

    time 获得当前日期

    addIndex 给任务列表添加索引

    assignTask 分配服务器

    exit 退出

    [11:02:06|Task Table#]statistical

    源表数据量:209235 合计任务量:208488

    [控制模块] 导入数据: N 采集: Y 同步: N 寄存器: 启用

    分组 任务数量

    amz_1 208488

    任务 数量 处理中 完成 未处理 失败 同步

    2 34748 753 33988 NULL 7 NULL

    1 34748 NULL 34740 NULL 8 NULL

    3 34748 477 34250 NULL 21 NULL

    4 34748 1590 33126 NULL 32 NULL

    6 34748 2191 32552 NULL 5 NULL

    5 34748 1433 33313 NULL 2 NULL

    状态 数量

    任务成功 201963

    处理中.. 6450

    任务失败 75

    没有重复的 标记

    [11:02:23|Task Table#]

    [13:50:37|Task Table#]statistical

    源表数据量:209235 合计任务量:208488

    [控制模块] 导入数据: N 采集: Y 同步: N 寄存器: 启用

    分组 任务数量

    amz_1 208488

    任务 数量 处理中 完成 未处理 失败 同步

    2 34748 NULL 34741 NULL 7 NULL

    1 34748 NULL 34740 NULL 8 NULL

    3 34748 NULL 34727 NULL 21 NULL

    4 34748 NULL 34716 NULL 32 NULL

    6 34748 NULL 34743 NULL 5 NULL

    5 34748 NULL 34746 NULL 2 NULL

    状态 数量

    任务成功 208413

    任务失败 75

    没有重复的 标记

    [13:52:19|Task Table#]

    展开全文
  • 使用 group by 语句结合聚集函数解决数据统计问题 ; 数据统计 一般的数据统计关系代数表达式如下: 其中L是属性集。含义是在属性集L上分组,分组后用函数fun运算 如 表示按性别sex的不同取值分组,再计算每个不同...

    任务描述
    本关任务:

    使用 group by 语句结合聚集函数解决数据统计问题 ;
    数据统计
    一般的数据统计关系代数表达式如下:

    其中L是属性集。含义是在属性集L上分组,分组后用函数fun运算

    表示按性别sex的不同取值分组,再计算每个不同性别的学生人数。
    假设有下面关系,利用上述分组计数统计则能得到:
    男 2
    女 2

    下面轮到你们来试一试了。

    编程要求
    我们已经为你建好了数据库与数据表,并添加了相应的数据内容。
    你只需根据右侧提示,完成以下任务:

    1.补全右侧代码片段中 第一题 下 Begin-End 区间的代码,统计 course表中学分数(credit)大于2的课程门数;

    2.补全右侧代码片段中 第二题 下 Begin-End 区间的代码,统计所有专业必修课(BT开头的课程代码)的学分总数。

    3.补全右侧代码片段中 第三题 下 Begin-End 区间的代码,按课程类别统计每个类别课程的门数,如课程代码BT001,BT002都是专业必修课。

    本题使用的关系如下:
    course(cno,cname,credit)
    对应课程代码,课程名称,学分,其中课程代码前2位代表不同类型的课程,如
    BT 代表 专业必修课,XZ 代表专业限选课。

    测试说明
    测试过程:

    本关涉及到的测试文件是 step1_test.sh ,平台将运行用户补全的 step1.sql 文件,得到数据;

    将得到的数据与答案比较,判断代码是否正确。

    USE test_wyy_db_guet
    GO
    
    SET NOCOUNT ON
    
     
    -- ********** Begin ********** --
    -- ********** 此处写第一题的SQL语句 ********** --
    SELECT COUNT(credit)
    FROM course
    WHERE course.credit>2;
    
    -- ********** End ********** --
    
    GO
     
    -- ********** Begin ********** --
    -- ********** 此处写第二题的SQL语句 ********** --
    SELECT SUM(credit)
    FROM course
    WHERE cno LIKE 'BT%';
    -- ********** End ********** --
    
    GO
    
     
    -- ********** Begin ********** --
    -- ********** 此处写第三题的SQL语句 ********** --
    SELECT SUBSTRING(cno,1,2),COUNT(cno)
    FROM course
    GROUP BY SUBSTRING(cno,1,2);
    -- ********** End ********** --
    
    GO
    

    任务描述
    本关任务:

    灵活使用分组操作和聚集函数实现数据统计功能
    本关使用的关系为printer(model,color,type,price)
    表示的含义是
    model:打印机型号;
    color:是否彩色, T 彩色,F 黑白
    type:类型,ink-jet 表示喷墨, laser 表示激光;
    price:单价

    编程要求
    1.补全右侧代码片段中 第一题 下 Begin-End 区间的代码,统计激光彩色打印机有多少种型号;
    2.补全右侧代码片段中 第二题 下 Begin-End 区间的代码,找出最便宜的喷墨打印机价格。
    3.补全右侧代码片段中 第三题 下 Begin-End 区间的代码,找出最贵的激光打印机型号和价格。
    测试说明
    测试过程:

    本关涉及到的测试文件是 step2_test.sh ,平台将运行用户补全的 step2.sql 文件,得到数据;

    将得到的数据与答案比较,判断代码是否正确。

    USE test_wyy_db_guet
    Go
    
    SET NOCOUNT ON
    
    
    -- ********** Begin ********** --
    ---------- 第一题----------
    SELECT COUNT(DISTINCT model)
    FROM printer
    WHERE type='laser' AND color='T';
    -- ********** End ********** --
    GO
    
    
    -- ********** Begin ********** --
    ---------- 第二题----------
    SELECT MIN(price)
    FROM printer
    WHERE type='ink-jet';
    -- ********** End ********** --
    GO
    
    -- ********** Begin ********** --
    ---------- 第三题----------
    SELECT model,price
    FROM printer
    WHERE price IN (SELECT MAX(price) FROM printer WHERE type='laser') AND type='laser';
    -- ********** End ********** --
    GO
    

    任务描述
    本关任务:

    灵活使用分组操作和聚集函数解决比较复杂的数据统计问题
    本关使用的关系说明:

    product(maker,model,type)
    maker:表示生产厂商
    model:生产的产品型号
    type:产品类型,有pc laptop两种

    pc(model,speed,ram,hd,price)
    表示型号,速度,内存大小,硬盘大小,价格

    laptop(model,speed,ram,hd,screen,price)
    表示型号,速度,内存大小,硬盘大小,屏幕大小和价格
    ####编程要求

    本题可使用视图V_test(视图已经创建完成,可直接使用,你不需要再次创建视图)
    了解视图的详细信息可参考下面的创建视图语句:
    create view V_test as
    select product.maker,product.model,product.type,pc.price,pc.hd,pc.speed from product join pc on product.model=pc.model
    union
    select product.maker,product.model,product.type,laptop.price,laptop.hd,laptop.speed from product join laptop on product.model=laptop.model

    1.补全右侧代码片段中 第1题 下 Begin-End 区间的代码,查询在一种或两种电脑(含PC和laptop)中出现过的硬盘的容量。

    2.补全右侧代码片段中 第2题 下 Begin-End 区间的代码,统计各生产厂商生产的电脑(不区分pc和laptop)的平均处理速度的最大值。

    3.补全右侧代码片段中 第3题 下 Begin-End 区间的代码,统计出各厂商生产价格高于1000的产品数量,不用区分是pc还是laptop

    4.补全右侧代码片段中 第4题 下 Begin-End 区间的代码,分别统计各厂商生产的pc,laptop的平均价格。

    测试说明
    测试过程:

    本关涉及到的测试文件是 step2_test.sh ,平台将运行用户补全的 step2.sql 文件,得到数据;

    将得到的数据与答案比较,判断代码是否正确。

    USE test_wyy_db_guet
    Go
    
    SET NOCOUNT ON
    
    ---------- 第1题 ----------
    -- ********** Begin ********** --
    SELECT hd
    FROM V_test
    GROUP BY hd
    HAVING COUNT(*)<3;
    
    
    
    -- ********** End ********** --
    
    GO
    
    ---------- 第2题 ----------
    -- ********** Begin ********** --
    SELECT MAX(AvgSpeed) FROM(
    SELECT maker AS maker,AVG(speed) AS AvgSpeed
    FROM V_test
    GROUP BY maker
    )name;
    
    
    -- ********** End ********** --
    
    GO
    
    ---------- 第3题 ----------
    -- ********** Begin ********** --
    SELECT maker,COUNT(*)
    FROM V_test
    WHERE price>1000
    GROUP BY maker;
    
    
    -- ********** End ********** --
    
    GO
    ---------- 第4题 ----------
    -- ********** Begin ********** --
    SELECT maker as maker,type,AVG(price)
    FROM V_test
    GROUP BY maker,type;
    
    
    -- ********** End ********** --
    
    GO
    
    
    展开全文
  • 现在越来越多的商业逻辑和应用程式逻辑都在使用Oracle服务器,所以PL/SQL编程在整个开发过程中也变得越来越重要。PL/SQL开发者在开发Oracle应用程序的时候都注重于开发工具简单易用,代码简洁和开发效率高等特点。PL...
  • 要创建一个自治事务,您必须在匿名块的最高层或者存储过程、函数、数据包或触发的定义部分中,使用PL/SQL中的PRAGMA AUTONOMOUS_TRANSACTION语句。在这样的模块或过程中执行的SQL Server语句都是自治的。 触发无法...
  • SQL函数

    2021-07-27 22:33:17
    本文PDF下载 本文示例数据库下载 ...下表给出了T-SQL函数的类别和描述。 函数类别 作用 聚合函数 执行的操作是将多个值合并为一个值。例如COUNT、SUM、MIN和MAX...
  • 函数与匿名函数

    2021-01-19 08:27:00
    函数与匿名函数一、函数在计算机科学中,函数是程序负责完成某项特定任务的代码单元,具有一定的独立性。1.函数的定义在Python中,函数在定义时需要满足这样的规则:使用关键字def引导;def后面是函数的名称,括号中...
  • 墨墨导读:在数据科学家岗位的面试中,窗口函数(WINDOW function)是SQL函数家族中经常会被问到的主题。在本文中,我会根据面试的问题,问题模式和解决问题的基本策略向你展示一些典...
  • 使用signal函数

    2021-01-27 18:22:05
    scala中的部分应用函数和偏函数的区别之前学习Scala编程语言时, 经常把部分应用函数(Partial Applied Function)和偏函数(Partial Function) 搞混。这里做个简单的总结以下的讨论基于 scala 2.8部分应用函数(Partial ...
  • 是一组能完成特定功能的SQL语句集 优点 运行效率高 降低了客户机和服务器之间的通信量 调用存储过程时,只需一个执行语句即可实现操作,而不需要在网络上发送大量的SQL代码,减少网络流量。 方便实施企业规划 安全...
  • 通过SQL注入得到WEBSHELL的原理:N.E.V.E.R的方法:利用数据库备份得到WEBSHELL。创建一个表,在表中建一个字段用来保存木马数据。然后利用MSSQL导出库文件的办法把整个数据导出来,最后再删除新建的表。分析:N.E.V.E...
  • 优化任务的意义 对于项目而言,可以节省机器计算资源 执行时间可能大幅度缩短,对于长链条任务依赖减少等待时间,尤其于上游任务而言,从而数据稳定性增加 spark UI 在上面的导航栏: 1 代表job页面,在里面可以...
  • MySQL数据库 - 使用聚合函数查询

    千次阅读 2021-01-20 11:20:53
    为了完成本关任务,你需要掌握:如何使用COUNT()函数。 COUNT()函数基本使用 COUNT()函数是用来统计记录的总条数。 select count(/字段名) from 数据表; 例子说明: 假设我们现在有一张表tb_dept;内容如下: 我们...
  • php执行系统命令函数

    2021-04-22 02:00:02
    2、添加一个任务计划,在(如图2所示)这一步输入命令:D:\\php4\\php.exe -q D:\\php4\\test.php 3、时间设置为每隔1分钟运行一次,然后运行这个......Matlab的常用函数及指令简单介绍_数学_自然科学_专业资料。...
  • 10个方法:Python执行SQL、Excel常见任务数据从业者有许多工具可用于分割数据。有些人使用 Excel,有些人使用SQL,有些人使用Python。对于某些任务使用 Python 的优点是显而易见的。以更快的速度处理更大的数据...
  • Mysql高级之存储过程原文:...在封装的语句体里面,可以if/else,case,while等控制结构.可以进行sql编程.在mysql中,存储过程和函数...文章杰克.陈2014-11-14657浏览量Mysql函数(function)|存储过程(procedure)func...
  • 使用SQL生成SQL技术完成维护任务的过程中,会遇到类似单引号这样的字符需要转义,给脚本编写带来了些许的麻烦。一般处理单引号转义是通过“两个单引号表示一个单引号”的规则完成转义。这种方法在在文章《【转义】...
  • 文章目录1、聚合函数介绍2、五个常用聚合函数3、GROUP BY4、HAVING5、SELECT...可以对数值型数据使用AVG(取平均)和SUM(求和)函数。(忽略NULL值行) SELECT AVG(salary), MAX(salary),MIN(salary), SUM(salary) FR
  • 最近了几次正则表达式,让我想到一个办法,可以使用正则表达式动态的根据查询SQL语句,自动的将形如select name,sex from tableName的查询SQL语句转换成select count(*) from tableName这样的统计SQL语句。...
  • 先搭建好ui,需要的内容大概是一个横版,然后创建一个scrow view,使用其中的vertical,创建一个任务物体(里面存放单个任务的ui,如框,文字等),保存为一个预制体放在resources文件里方便后期通过代码自动生成,...
  • sql turning advise的使用

    2021-05-02 10:42:35
    sql turning advise(sta)SQL优化器SQL Tuning Advisor(STA),是oracle的sql优化补助工具。其实优化sql主要有两个方案:其一是改写sql本身,改写sql需要对sql语法、数据库的执行方式都要有较好地理解。其二就是这个...
  • (1)hive并不是所有的查询都需要走MR...ps:该参数设置为none时,所有任务转化为MR,一般默认是more (2)hive中需要走MR的sql,通常涉及key的shuffle,比如join、group by、distinct等 以下参照链接:HiveSQL转化
  • 第六章:SQL Server2019数据库之 SELECT 语句的深入使用

    千次阅读 多人点赞 2021-04-07 14:33:43
    目录一、范围查询1、查询两个值、两个日期之间的数据2、在 BETWEEN 中使用日期函数3、日期时间查询二、使用逻辑运算符过滤数据1、使用 AND 运算符2、使用 OR 运算符3、使用 NOT 运算符三、使用 IN 操作符过滤数据1、...
  • 一、实验目的熟悉通过嵌入式SQL(主语言为C语言)编程访问数据库。二、实验平台和实验工具在KingbaseES数据库管理系统上,通过...通过嵌入式SQL编程访问数据库的基本步骤,对学生课程数据库中的表,完成下面功能(你也...
  • 经过我不懈努力,最终解决了所有问题,顺利完成任务。下面我把我遇到的问题写下来和大家探讨一下。一、问题提出这个excel大概1W条数据,数据量不是很大,开始导入也很顺利。不到一分钟就完成了,结果我发现有一列...
  • sql性能优化

    2021-03-04 01:48:23
    减少 IO 次数IO永远是数据库最容易瓶颈的地方,这是由数据库的职责所决定的,大部分数据库操作中超过90%的时间都是 IO 操作所占用的,减少 IO 次数是 SQL 优化中需要第一优先考虑,当然,也是收效最明显的优化手段。...
  • 在现代Internet中,我们经常需要从世界各地的用户那里获取输入数据。但是,我们都知道“用户输入的数据永远...PHP函数特点有哪些?PHP函数是什么?在数学知识里,函数是由参数的定义域和在这个参数定义域上的某种...
  • 使用connect by进行级联查询connect by可以用于级联查询,常用于对具有树状结构的记录查询某一节点的所有子孙节点或所有祖辈节点。来看一个示例,现假设我们拥有一个菜单表t_menu,其中只有三个字段:id、name和...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 103,483
精华内容 41,393
关键字:

哪些任务能用sql函数完成