精华内容
下载资源
问答
  • 在扩展有限元的框架下,引入一个内聚的尖加强函数,相比传统的尖加强函数而言,该内聚加强函数具有相同精度但自由度很少的优势。采用改进的扩展有限元方法对裂尖附近小孔的不同布置方案下裂纹的扩展过程进行了追踪...
  • 函数指针与指针函数

    2017-12-18 11:16:47
    对于所有的用户来说,estimate()中一部分代码都是相同的,但该函数允许每个程序员都提供自己的算法来估算自己算法运行所需的时间。 为实现这种目标,采用的机制是,将程序员要使用的算法函数的地址传递给estimate()...

    假设要设计一个名为estimate()的函数,估算编写指定行数的代码所需的时间,并且希望不同的程序员都使用该函数。对于所有的用户来说,estimate()中一部分代码都是相同的,但该函数允许每个程序员都提供自己的算法来估算自己算法运行所需的时间。

    为实现这种目标,采用的机制是,将程序员要使用的算法函数的地址传递给estimate()。因此,必须能完成下面工作:
    (1)获取函数的地址;

    (2)声明一个函数指针;

    (3)使用函数指针来调用函数。

    double pam(int);
    double (*pf)(int);  //pf points to a function that return double
    double *pf(int);    //pf() a function that returns a pointer-to-double

    pam()的特征标和返回值类型必须与pf相同。

    pf = pam;               //pf now points to the pam() function
    double x = pam(4);      //call pam() using the function name
    double y = (*pf)(5);    //call pam() using the pointer pf. 
    double y = pf(5);       //also call pam() using the pointer pf
    This means pf == (*pf).



    展开全文
  • SparkSQL通过FlatMap算子实现列转行(炸) 我了两种方法实现列转行,说一下我平时使用SparkSQL的习惯,我通常 1)是先读取HDFS中的文件,包括txt、parquet等格式 2)然后通过createOrReplaceTempView 方法创建临时...

    [SparkSQL] 列转行lateral view explode函数和FlatMap算子两种方式实现炸裂

    我用了两种方法实现列转行,说一下我平时使用SparkSQL的习惯,我通常
    1)是先读取HDFS中的文件,包括txt、parquet等格式
    2)然后通过createOrReplaceTempView 方法创建临时表格
    3)之后写sql直接处理
    相关代码可以参考我写的另一篇文章:

    一、开发环境

    spark-2.1.0-bin-hadoop2.6

    二、纯SQL实现列转行

    1、因为我在项目中的需求是同时将两个Array字段展开,所以在这里举的例子是同时处理两个字段的情况。
    2、要提醒的是,同时展开多个字段会造成数据膨胀严重,计算时会消耗大量的资源,需要根据实际情况进行考虑,选择比较合适的方法。
    3、语法:使用lateral view explode 函数进行列转行,新字段的别名,不能和以前的字段名相同。

    sparkSession.sql(
      s"""
        |select
        |    user_id,
        |    hobby,
        |    skill
        |from t1
        |lateral view explode(hobbies) tempcol as hobby
        |lateral view explode(skills) tempcol as skill
      """.stripMargin
      )
    

    三、使用DataFrame、Rdd格式数据,通过FlatMap算子实现列转行

    /**
      * 自定义函数,在flatMap算子中调用,将Array类型数据遍历,并合其他字段进行拼接,返回Seq序列
      * 同时实现两列的列转行
      */
    def splitCate(user_id: String,hobbies: Seq[String], skills: Seq[String]):Seq[Row] = {
      val hobbieList = hobbies.toString().split(",")
      val skillList = skills.toString().split(",")
      var resSeq = Seq[Row]()
      
      //如果不为空null或是空,进行遍历,拼接Row类型的序列。由于同时处理两个字段的列转行,
      //所以在判断一个字段是否为空或为null的同时,嵌套判断另一个字段是否为空或为null
      if(hobbieList!=null || !hobbieList.isEmpty){
        for (h <- hobbieList) {
          if(skillList != null || !skillList.isEmpty){
            for(s <- skillList){
              resSeq = resSeq :+ Row(user_id,  h, s)
            }
          }else{
            resSeq = resSeq :+ Row(user_id, h,null)
          }
        }
      }else{
          if(skillList != null || !skillList.isEmpty){
            for(s <- skillList){
              resSeq = resSeq :+ Row(user_id, null,s)
            }
          }else{
            resSeq = resSeq :+ Row(user_id,null,null)
          }
      }
      resSeq
    }
    
    //getAs[]() 中数据类型必须和获取到的字段的数据类型保持一致
    val flatMapRdd = leftJoinDF.rdd.repartition(200).flatMap(row => {
          val user_id = row.getAs[String]("user_id")
          val hobbies = row.getAs[Seq[String]]("cate")
          val skills = row.getAs[Seq[String]]("sub_cate")
        
          splitCate(user_id, hobbies,skills)
        })
        
        //创建schema,用于列转行之后的Rdd转化为DataFrame
        val schema = StructType(List(
          StructField("user_id", StringType, nullable = false),
          StructField("hobby", StringType, nullable = true),
          StructField("skill", StringType, nullable = true),
        )
        )
        val flatMapDF = sparkSession.createDataFrame(flatMapRdd, schema)
    
    展开全文
  • 函数/生成函数

    2019-07-01 17:20:43
    解 由于两个商店的相同的,只需要考虑其中一个,可以写出其生成函数为: lim ⁡ n → ∞ ∑ i = 0 n i x i = lim ⁡ n → ∞ ∑ i = 1 n i x i \begin{aligned}\lim_{n→\infty}\sum_{i=0}^{n}ix^i=\lim_{n→\...

    前言


    %  本文致力在追求严谨的前提下尽量通俗易懂。
      若无法理解部分公式,可尝试将其中的sigma化简为带省略号的形式。本文的例题中含有思维过程,但绝大部分习题中不含思维过程,仅供参考。
      特殊 规定 00=10^0=1,这样可以避免很多麻烦。

    概念


    %  级数 级数是指将数列的项依次用加号连接起来的函数
      
      收敛发散 若 nn→\infty 时, f(n)0f(n)→0 ,我们称级数是收敛的,否则为发散的,即 limnf(n)=0\lim_{n→\infty}f(n)=0.
      
      幂级数 形如 an(xx0)n\sum a_n(x-x_0)^n 的级数,称之为幂级数。其中 x0x_0 为常数,aia_i 为系数。
      
      形式幂级数 在形式幂级数中,xx 从来不指定一个数值,且对收敛和发散的问题不感兴趣,感兴趣的是系数序列,即 aia_i,因而在实际变形运算中,既可以认为其是收敛的,也可以认为其是发散的。
      
      生成函数 生成函数分成两种,分别为普通型生成函数和指数型生成函数。
      
      普通型生成函数 对于任意数列 a0,a1,a2ana_0,a_1,a_2\cdots a_n 用如下方法与一个函数联系起来:G(x)=i=0naixiG(x)=\sum_{i=0}^{n}a_ix^i  则称 G(x)G(x) 是数列 a0,a1,a2ana_0,a_1,a_2\cdots a_n普通生成函数(Ordinary generating function),缩写为 OGF\text{OGF}
      
      指数型生成函数 对于任意数列 a0,a1,a2ana_0,a_1,a_2\cdots a_n 用如下方法与一个函数联系起来:
    G(x)=i=0naii!xiG(x)=\sum_{i=0}^{n}\frac{a_i}{i!}x^i  则称 G(x)G(x) 是数列 a0,a1,a2ana_0,a_1,a_2\cdots a_n指数型生成函数(Exponential generating function),缩写为 EGF\text{EGF}

    OGF\text{OGF} 变形


    %  事实上,对于 OGF\text{OGF} 变形问题,只需要会证明一条公式即可掌握大部分。
    1(1ax)m=limNn=0NCn+m1m1anxn\begin{aligned}\frac{1}{(1-ax)^m}=\lim_{N→\infty}\sum_{n=0}^{N}C_{n+m-1}^{m-1}a^nx^n\end{aligned} 根据等比数列的求和公式,有:limni=0naixi=limn1an+1xn+11ax\lim_{n→\infty}\sum_{i=0}^{n}a^ix^i=\lim_{n→\infty}\frac{1-a^{n+1}x^{n+1}}{1-ax}  当级数收敛时,有 limnxn+1=0\lim_{n→\infty}x^{n+1}=0,因而有:limni=0naixi=11ax\lim_{n→\infty}\sum_{i=0}^{n}a^ix^i=\frac{1}{1-ax}  进一步得到:1(1ax)m=(11ax)m=(limni=0naixi)m\frac{1}{(1-ax)^m}=\left(\frac{1}{1-ax}\right)^m=\left(\lim_{n→\infty}\sum_{i=0}^{n}a^ix^i\right)^m  考虑第 kk 个括号中,选取 tkt_k 次项,也就是选取 atkxtka_{t_k}x^{t_k},则选出来的所有 kk 项对 n=tkn=\sum t_k 次项有 ana^{n} 的贡献。
      由隔板问题可以得知,取 mm 个数,使得它们的和为 nn 的方案数相当于将 nn 个物品划分为 mm 份,等于在 n+m1n+m-1 个物品中插入 m1m-1 个隔板(tit_i 可以为0,因而需要强制每组选一个,并给总数增加隔板个),因而满足 n=tkn=\sum t_ktt 序列的可能方案共有 Cn+m1m1C_{n+m-1}^{m-1} 种。故 nn 次项前的系数为 Cn+m1m1anC_{n+m-1}^{m-1}a^n。得证。
      
      有了这条公式,我们可以便捷地得到许多结论,但注意反过来也成立,例如当 m=1m=1 时,有:11ax=i=0aixi\frac{1}{1-ax}=\sum_{i=0}^{\infty}a^ix^i  当 m=2m=2 时,有:1(1ax)2=i=0Ci+11aixi=i=0(i+1)aixi\frac{1}{(1-ax)^2}=\sum_{i=0}^{\infty}C_{i+1}^{1}a^ix^i=\sum_{i=0}^{\infty}(i+1)a^ix^i  以另一种方式展开可以得到:  1(1ax)2=(11ax)2=(i=0aixi)2\frac{1}{(1-ax)^2}=\left(\frac 1{1-ax}\right)^2=\left(\sum_{i=0}^\infty a^ix^i\right)^2  换句话说,我们有(i=0aixi)2=1(1ax)2=i=0(i+1)aixi\left(\sum_{i=0}^\infty a^ix^i\right)^2=\frac{1}{(1-ax)^2}=\sum_{i=0}^{\infty}(i+1)a^ix^i
      
      除此之外,还需要掌握二项式定理广义二项式定理。其中二项式定理的严格证明需要用到数学归纳法,过程较为复杂,在此不再赘述,仅给出结论:(x+y)n=k=0nCnkxkynk(x+y)^n=\sum_{k=0}^nC_n^kx^{k}y^{n-k}  广义二项式定理则是对二项式定理的推广,它使得 nn 的值域可以推广到全体实数。(x+y)α=k=0(αk)xαkyk\begin{aligned}(x+y)^\alpha=\sum_{k=0}^\infty\bigg(\begin{aligned}\alpha\\k\end{aligned}\bigg)x^{\alpha-k}y^{k}\end{aligned}  其中(αk)=α(α1)(αk+1)k!\bigg(\begin{aligned}\alpha\\k\end{aligned}\bigg)=\frac{\alpha(\alpha-1)\cdots(\alpha-k+1)}{k!}

    OGF\text{OGF} 变形练习


    例题1 给定三种硬币,面值分别为 1,2,51,2,5 并且给定三种硬币的数量分别为 a,b,ca,b,c,求这些硬币所不能组成的最小面额。(hdu 1085)

     由于总面额是由所有面额相加,对应同底数幂相乘,底数不变,指数相加,因而我们将次数设定为面额,由于方案数量相乘,对应系数相乘,因而我们将系数设定为方案数量,则取面额为1的硬币的生成函数为:
    i=0axi\sum_{i=0}^ax^i  同理可得分别取面额为2和面额为5的硬币的生成函数,将它们的生成函数乘起来,得:
    (i=0axi)(j=0bx2j)(k=0cx3k)\begin{aligned}\left(\sum_{i=0}^{a}x^i\right)\left(\sum_{j=0}^{b}x^{2j}\right)\left(\sum_{k=0}^{c}x^{3k}\right)\end{aligned}  可以发现,结果的 nn 次项系数 ana_n 即为组成面额为 nn 的方案数。则答案为系数为 00 的最小次项的系数。若 nn 较小,可以直接暴力拆式子,反之则需要FFT展开。


    例题2 现在有两个商店 ,在其中一个商店中消费 ii 元有 ii 种方案,求在两个商店中共消费 nn 元的方案数。

     由于两个商店的相同的,只需要考虑其中一个,可以写出其生成函数为:limni=0nixi=limni=1nixi\begin{aligned}\lim_{n→\infty}\sum_{i=0}^{n}ix^i=\lim_{n→\infty}\sum_{i=1}^{n}ix^i\end{aligned}  则在两商店中消费的生成函数为上式的二次方,化简得:(limni=1nixi)2=(xlimni=0n(i+1)xi)2=(xlimni=0nCi+11aixi)2=(x(1x)2)2=x2(1x)4\begin{aligned}\left(\lim_{n→\infty}\sum_{i=1}^{n}ix^i\right)^2&=\left(x\lim_{n→\infty}\sum_{i=0}^{n}(i+1)x^i\right)^2\\ &=\left(x\lim_{n→\infty}\sum_{i=0}^{n}C_{i+1}^{1}a^ix^i\right)^2\\ &=\left(\frac{x}{(1-x)^2}\right)^2\\ &=\frac{x^2}{(1-x)^4}\\ \end{aligned}  然后拆开:x2(1x)4=x2(limni=0nCi+413xi)  =limni=0nCi+33xi+2\begin{aligned}\frac{x^2}{(1-x)^4}&=x^2\left(\lim_{n→\infty}\sum_{i=0}^nC_{i+4-1}^{3}x^i\right)\\   &=\lim_{n→\infty}\sum_{i=0}^{n}C_{i+3}^3x^{i+2} \end{aligned}   则答案为上式的 nn 次项系数。
      当 i+2=ni+2=n 时,i=n2i=n-2nn 次项为 Cn2+33xnC_{n-2+3}^3x^n,故答案为 Cn+13C_{n+1}^3


    习题1 现在有ABCD四种物体,每种无限个。现在要你拿出共 nn 个物体,要求A的个数必需是偶数,B的个数必须是 55 的倍数,C最多拿 44 个,D最多拿 11 个,求可行的方案数量。

     由题意写出并化简分别取ABCD的生成函数:A(x)=limni=0nx2i=11x2B(x)=limni=0nx5i=11x5C(x)=i=04xi=1x51xD(x)=i=01xi=1+x\begin{aligned} A(x)&=\lim_{n→\infty}\sum_{i=0}^nx^{2i}=\frac{1}{1-x^2}\\ B(x)&=\lim_{n→\infty}\sum_{i=0}^nx^{5i}=\frac{1}{1-x^5}\\ C(x)&=\sum_{i=0}^4 x^i=\frac{1-x^5}{1-x}\\ D(x)&=\sum_{i=0}^1 x^i=1+x\\ \end{aligned}  乘起来,化简,再展开得:(1x5)(1+x)(1x2)(1x5)(1x)=1+x(1+x)(1x)(1x)=1(1x)2=limni=0nCi+11xi\begin{aligned} \frac{(1-x^5)(1+x)}{(1-x^2)(1-x^5)(1-x)}&=\frac{1+x}{(1+x)(1-x)(1-x)}\\ &=\frac{1}{(1-x)^2}\\ &=\lim_{n→\infty}\sum_{i=0}^nC_{i+1}^{1}x^i \end{aligned}  因而答案为 nn 次项前的系数 ai=Ci+11=i+1a_i=C_{i+1}^1=i+1


    习题2 有A~H八种物品各无限个,你需要取出其中共 nn 个,满足:
      A:偶数个
      B:0~1个
      C:0~2个
      D:奇数个
      E:4的倍数个
      F:0~3个
      G:不超过1个
      H:3的倍数个
      (BZOJ3028)

     写出分别取A~H的生成函数:
    A(x)=i=0x2i=11x2B(x)=1+xC(x)=1+x+x2=1x31xD(x)=i=0x2i+1=xi=0x2i=x1x2E(x)=i=0x4i=11x4F(x)=1+x+x2+x3=1x41xG(x)=1+xH(x)=i=0x3i=11x3\begin{aligned} A(x)&=\sum_{i=0}^{\infty}x^{2i}=\frac{1}{1-x^2}\\ B(x)&=1+x\\ C(x)&=1+x+x^2=\frac{1-x^3}{1-x}\\ D(x)&=\sum_{i=0}^{\infty}x^{2i+1}=x\sum_{i=0}^{\infty}x^{2i}=\frac{x}{1-x^2}\\ E(x)&=\sum_{i=0}^{\infty}x^{4i}=\frac{1}{1-x^4}\\ F(x)&=1+x+x^2+x^3=\frac{1-x^4}{1-x}\\ G(x)&=1+x\\ H(x)&=\sum_{i=0}^{\infty}x^{3i}=\frac{1}{1-x^3}\\ \end{aligned}  相乘并化简,得:x(1+x)2(1x3)(1x4)(1x2)2(1x)2(1x4)(1x3)=x(1+x)2(1x2)2(1x)2=x(1+x)2(1+x)2(1x)4=x(1x)4\begin{aligned} \frac{x(1+x)^2(1-x^3)(1-x^4)}{(1-x^2)^2(1-x)^2(1-x^4)(1-x^3)} &=\frac{x(1+x)^2}{(1-x^2)^2(1-x)^2}\\ &=\frac{x(1+x)^2}{(1+x)^2(1-x)^4}\\ &=\frac{x}{(1-x)^4}\\ \end{aligned}  然后再展开,得:x(1x)4=x(i=0Ci+33xi)=i=0Ci+33xi+1\begin{aligned}\frac{x}{(1-x)^4}&=x\left(\sum_{i=0}^\infty C_{i+3}^{3}x^i\right)\\&=\sum_{i=0}^\infty C_{i+3}^3x^{i+1}\end{aligned}  当 n=i+1n=i+1 时, i=n1i=n-1,故答案为 Ci+23C_{i+2}^3


    例题3 求序列 ai=i2a_i=i^2 的生成函数。

     令该序列的生成函数为 F(x)F(x),则:
    F(x)=i=0i2xi=i=1i2xi(1)F(x)=\sum_{i=0}^\infty i^2x^i=\sum_{i=1}^\infty i^2x^i\tag{1}  考虑到系数中的二次方不好处理,尝试将其转换为一次。我们有:xF(x)=i=0i2xi+1(2)xF(x)=\sum_{i=0}^\infty i^2x^{i+1}\tag{2}  (1)(1)式减(2)(2)式得:F(x)xF(x)=i=1i2xii=0i2xi+1=i=1i2xii=1(i1)2xi=i=1(i2(i1)2)xi=i=1(2i1)xi=2i=1ixii=1xi=2xi=0(i+1)xixi=0xi=2x(1x)2x1x=2xx(1x)(1x)2=x2+x(1x)2=x(x+1)(1x)2\begin{aligned}F(x)-xF(x) &=\sum_{i=1}^\infty i^2x^i-\sum_{i=0}^\infty i^2x^{i+1}\\ &=\sum_{i=1}^\infty i^2x^i-\sum_{i=1}^\infty (i-1)^2x^{i}\\ &=\sum_{i=1}^\infty \left(i^2-\left(i-1\right)^2\right)x^i\\ &=\sum_{i=1}^\infty \left(2i-1\right)x^i\\ &=2\sum_{i=1}^\infty ix^i-\sum_{i=1}^\infty x^i\\ &=2x\sum_{i=0}^\infty (i+1)x^{i}-x\sum_{i=0}^\infty x^i\\ &=\frac{2x}{(1-x)^2}-\frac{x}{1-x}\\ &=\frac{2x-x(1-x)}{(1-x)^2}\\ &=\frac{x^2+x}{(1-x)^2}\\ &=\frac{x(x+1)}{(1-x)^2} \end{aligned}  因而有:(1x)F(x)=x(x+1)(1x)2(1-x)F(x)=\frac{x(x+1)}{(1-x)^2}  最终得到:
    F(x)=x(x+1)(1x)3F(x)=\frac{x(x+1)}{(1-x)^3}


    例题4 写出卡特兰数的递推式。

     令第 nn 个卡特兰数为 fnf_n,根据定义可得:
    fn=[n=0]+i=0n1fifni1f_n=[n=0]+\sum_{i=0}^{n-1}f_if_{n-i-1}  设其生成函数为 F(x)F(x),则
    F(x)=n=0fnxn=1+n=1fnxn=1+n=1(i=0n1fifni1)xn=1+xn=1(i=0n1fixifni1xni1)=1+xF2(x)\begin{aligned}F(x) &=\sum_{n=0}^\infty f_nx^n\\ &=1+\sum_{n=1}^\infty f_nx^n\\ &=1+\sum_{n=1}^\infty \left(\sum_{i=0}^{n-1}f_if_{n-i-1}\right)x^n\\ &=1+x\sum_{n=1}^\infty \left(\sum_{i=0}^{n-1}f_ix^i\cdot f_{n-i-1}x^{n-i-1}\right)\\ &=1+xF^2(x)\\ \end{aligned}整理一下,得:xF2(x)F(x)+1=0xF^2(x)-F(x)+1=0  以 F(x)F(x) 为未知数,解方程,得:Δ=(1)24x=14xF1(x)=(1)+Δ2x=1+14x2xF2(x)=(1)Δ2x=114x2x\begin{aligned} \Delta&=(-1)^2-4x=1-4x\\ F_1(x)&=\frac{-(-1)+\sqrt{\Delta}}{2x}=\frac{1+\sqrt{1-4x}}{2x}\\ F_2(x)&=\frac{-(-1)-\sqrt{\Delta}}{2x}=\frac{1-\sqrt{1-4x}}{2x} \end{aligned}这里的正负号取哪一个?考虑到F(0)=f0x0=1F(0)=f_0x^0=1 而由洛必达法则limx0F1(x)=limx01+14x2x=limx0114x=1\lim_{x→0}F_1(x)=\lim_{x→0}\frac{1+\sqrt{1-4x}}{2x}=\lim_{x→0}-\frac{1}{\sqrt{1-4x}}=-1limx0F2(x)=limx0114x2x=limx0114x=1\lim_{x→0}F_2(x)=\lim_{x→0}\frac{1-\sqrt{1-4x}}{2x}=\lim_{x→0}\frac{1}{\sqrt{1-4x}}=1因而有F(x)=114x2x=1(14x)122xF(x)=\frac{1-\sqrt{1-4x}}{2x}=\frac{1-(1-4x)^{\frac 12}}{2x}看到分数指数幂,应该能想到用广义二项式定理。
    (14x)12=n=0(12n)(4x)n(3)\begin{aligned} (1-4x)^{\large\frac 12}&=\sum_{n=0}^\infty {{\frac 12} \choose n}(-4x)^n\tag{3}\\ \end{aligned}其中(12n)=12(121)(12n+1)n!=i=0n112in!=i=0n112i2n!=i=1n1(12i)2nn!=(1)×(3)×(5)××(32n)2nn!=(1)n1×1×3×5××(2n3)2nn!=(1)n1×(2n2)!2nn!×2×4××(2n2)=(1)n1×(2n2)!22n1n!(n1)!\begin{aligned}\frac{1}{2}\choose n &=\frac{{\frac 12}\left({\frac 12}-1\right)\dots\left({\frac 12}-n+1\right)}{n!}\\ &=\frac{{\prod_{i=0}^{n-1}{\frac 12}}-i}{n!}=\frac{\prod_{i=0}^{n-1}{\frac {1-2i}{2}}}{n!}=\frac {\prod_{i=1}^{n-1}(1-2i)}{2^{n}n!}\\ &=\frac {(-1)\times(-3)\times(-5)\times \cdots\times(3-2n)}{2^{n}n!}\\ &=\frac {(-1)^{n-1}\times 1\times3\times5\times \cdots\times(2n-3)}{2^{n}n!}\\ &=\frac {(-1)^{n-1}\times(2n-2)!}{2^{n}n!\times 2\times 4\times\dots\times (2n-2)}\\ &=\frac {(-1)^{n-1}\times(2n-2)!}{2^{2n-1}n!(n-1)!}\\ \end{aligned}回代 (3)(3) 式有(14x)12=n=0(1)n1×(2n2)!22n1n!(n1)!(4x)n=n=0(1)n1×(2n2)!22n1n!(n1)!(1)n22nxn=n=02×(2n2)!n!(n1)!xn=12n=1(2n2)!n!(n1)!xn\begin{aligned}(1-4x)^{\frac 12}&=\sum_{n=0}^\infty \frac {(-1)^{n-1}\times(2n-2)!}{2^{2n-1}n!(n-1)!}(-4x)^n\\ &=\sum_{n=0}^\infty \frac {(-1)^{n-1}\times(2n-2)!}{2^{2n-1}n!(n-1)!}(-1)^n2^{2n}x^n\\ &=\sum_{n=0}^\infty -2\times \frac {(2n-2)!}{n!(n-1)!}x^n\\ &=1-2\sum_{n=1}^\infty \frac {(2n-2)!}{n!(n-1)!}x^n\\ \end{aligned}回代,得:F(x)=1(12n=1(2n2)!n!(n1)!xn)2x=n=1(2n2)!n!(n1)!xnx=n=0(2(n+1)2)!(n+1)!((n+1)1)!xn=n=0(2n)!n!(n+1)!xn=n=0(2n)!n!(2nn)!n+1xn=n=0C2nnn+1xn\begin{aligned} F(x)&=\frac{1-\left(1-2{\sum_{ n=1}^{\infty}} {\frac {(2n-2)!}{n!(n-1)!}}x^n\right)}{2x}\\ &=\frac {{\sum_{ n=1}^{\infty}} {\frac {(2n-2)!}{n!(n-1)!}}x^n}{x}\\ &={\sum\limits_{n=0}^{\infty}} {\frac {(2(n+1)-2)!}{(n+1)!((n+1)-1)!}}x^n\\ &={\sum\limits_{n=0}^{\infty}} {\frac {(2n)!}{n!(n+1)!}}x^n\\ &={\sum\limits_{n=0}^{\infty}} {\frac {\frac{(2n)!}{n!(2n-n)!}}{n+1}}x^n\\ &={\sum\limits_{n=0}^{\infty}} {\frac { C_{2n}^n}{n+1}}x^n\\ \end{aligned}因而有fn=C2nnn+1f_n=\frac{ C_{2n}^n}{n+1}这就是我们要的结论了。


    例题4 求斐波那契数列的通项式。

     首先写出它的递推式:f0=0,f1=1,fi=fi1+fi2f_0=0,f_1=1,f_i=f_{i-1}+f_{i-2},设其生成函数为 F(x)F(x),则
    F(x)=i=0fixi=x+i=2fixi=x+i=2(fi1+fi2)xi=x+i=2fi1xi+i=2fi2xi=x+xi=2fi1xi1+x2i=2fi2xi2=x+xi=1fi1xi1+x2i=2fi2xi2=x+xi=0fixi+x2i=0fixi=x+xF(x)+x2F(x)\begin{aligned} F(x)&=\sum_{i=0}^\infty f_ix^i\\ &=x+\sum_{i=2}^\infty f_ix^i\\ &=x+\sum_{i=2}^\infty (f_{i-1}+f_{i-2})x^i\\ &=x+\sum_{i=2}^\infty f_{i-1}x^i+\sum_{i=2}^\infty f_{i-2}x^i\\ &=x+x\sum_{i=2}^\infty f_{i-1}x^{i-1}+x^2\sum_{i=2}^\infty f_{i-2}x^{i-2}\\ &=x+x\sum_{i=1}^\infty f_{i-1}x^{i-1}+x^2\sum_{i=2}^\infty f_{i-2}x^{i-2}\\ &=x+x\sum_{i=0}^\infty f_{i}x^{i}+x^2\sum_{i=0}^\infty f_{i}x^{i}\\ &=x+xF(x)+x^2F(x)\\ \end{aligned}  整理,得
    (x2+x1)F(x)=x(x^2+x-1)F(x)=-x  解得F(x)=x1xx2=x×11xx2F(x)=\frac{x}{1-x-x^2}=x\times \frac{1}{1-x-x^2}  后面部分的生成函数似乎无法展开,那怎么办?考虑裂项。设A1ax+B1bx=11xx2\frac{A}{1-ax}+\frac{B}{1-bx}=\frac{1}{1-x-x^2}  通分,得A(1bx)+B(1ax)(1ax)(1bx)=x1xx2\frac{A(1-bx)+B(1-ax)}{(1-ax)(1-bx)}=\frac{x}{1-x-x^2}   化简,得A+B(Ab+Ba)x1(a+b)x+abx=11xx2\frac{A+B-(Ab+Ba)x}{1-(a+b)x+abx}=\frac{1}{1-x-x^2}  对比两侧系数,可得方程组
    {A+B=1Ab+Ba=0a+b=1ab=1\begin{cases} &A+B&=&1\\ &Ab+Ba&=&0\\ &a+b&=&1\\ &ab&=&-1 \end{cases}  解得1
    {A=a5B=b5a=1+52b=152\begin{cases} A&=\dfrac a{\sqrt 5}\\ B&=-\dfrac b{\sqrt 5}\\ a&=\dfrac{1+\sqrt 5}{2}\\ b&=\cfrac{1-\sqrt 5}{2} \end{cases}  回代,得
    F(x)=x×11xx2=x(a5×11axb5×11bx)=15×ax1ax15×ax1bx=15×i=0ai+1xi+115×i=1bi+1xi+1=15×(i=0ai+1xi+1i=1bi+1xi+1)=i=115(aibi)xi=i=015(aibi)xi\begin{aligned}F(x) &=x\times \frac1{1-x-x^2}\\ &=x\left(\dfrac a{\sqrt 5}\times \frac{1}{1-ax}-\frac{b}{\sqrt 5}\times \frac 1{1-bx}\right)\\ &=\dfrac 1{\sqrt 5}\times \frac{ax}{1-ax}-\frac{1}{\sqrt 5}\times \frac {ax}{1-bx}\\ &=\dfrac 1{\sqrt 5}\times \sum_{i=0}^\infty a^{i+1}x^{i+1}-\frac{1}{\sqrt 5}\times \sum_{i=1}^\infty b^{i+1}x^{i+1}\\ &=\dfrac 1{\sqrt 5}\times \left(\sum_{i=0}^\infty a^{i+1}x^{i+1}-\sum_{i=1}^\infty b^{i+1}x^{i+1}\right)\\ &=\sum_{i=1}^\infty \dfrac 1{\sqrt 5}\left(a^{i}-b^{i}\right)x^{i}\\ &=\sum_{i=0}^\infty \dfrac 1{\sqrt 5}\left(a^{i}-b^{i}\right)x^{i}\\ \end{aligned}

    %  因而 nn 次项系数即为斐波那契数列第 nn
    fn=15[(1+52)n(152)n]f_n=\frac{1}{\sqrt 5}\left[\left(\dfrac{1+\sqrt 5}{2}\right)^n-\left(\dfrac{1-\sqrt 5}{2}\right)^n\right]


    例题5 已知序列的递推式和边界 a0=2,an=3an1+2a_0=2,a_n=3a_{n-1}+2,求通项公式。

     将边界放入递推式中,得:an=2[n=1]+3an1+2a_n=2[n=1]+3a_{n-1}+2   还是一样,怎么麻烦怎么来
    F(x)=n=0anxn=n=0(2[n=1]+3an1+2)xn=2+n=1(3an1+2)xn=2+n=13an1xn+2xn=2+3xn=1an1xn1+2n=1xn=3xn=0an1xn1+2n=0xn=3xF(x)+21x\begin{aligned} F(x)&=\sum_{n=0}^\infty a_nx^n\\ &=\sum_{n=0}^\infty (2[n=1]+3a_{n-1}+2)x^n\\ &=2+\sum_{n=1}^\infty (3a_{n-1}+2)x^n\\ &=2+\sum_{n=1}^\infty 3a_{n-1}x^n+2x^n\\ &=2+3x\sum_{n=1}^\infty a_{n-1}x^{n-1}+2\sum_{n=1}^\infty x^n\\ &=3x\sum_{n=0}^\infty a_{n-1}x^{n-1}+2\sum_{n=0}^\infty x^n\\ &=3xF(x)+\frac{2}{1-x}\\ \end{aligned}  整理,得
    F(x)=2×11x×113x=2×(i=0xi)×(j=03jxj)\begin{aligned} F(x)&=2\times \frac 1{1-x}\times \frac{1}{1-3x}\\ &=2\times \left(\sum_{i=0}^\infty x^i\right)\times \left(\sum_{j=0}^\infty 3^jx^j\right)\\ \end{aligned}  我们枚举第二个括号中选择的项的次数 kk,则 nn 次项系数为 an=2k=0n1nk3k=2k=0n3k=2×13n+113=3n+11a_n=2\sum_{k=0}^n1^{n-k}3^{k}=2\sum_{k=0}^n3^k=2\times \frac{1-3^{n+1}}{1-3}=3^{n+1}-1  也就是我们要的通项式。


    习题4 已知递推式 a1=1,an=2an1+3n1a_1=1,a_n=2a_{n-1}+3^{n-1},求它的通项式。

     我们可以先考虑 a0=1,an=2an1+3na_0=1,a_{n}=2a_{n-1}+3^{n},然后整体移动一位。令 aa 的生成函数为 F(x)F(x),则
    F(x)=n=0aixn=n=0([n=0]+2an1+3n)xn=1+n=1(2an1+3n)xn=1+xn=12an1xn1+n=13nxn=1+2xn=1an1xn1+(n=03nxn)1=2xF(x)+113x\begin{aligned} F(x)&=\sum_{n=0}^\infty a_ix^n\\ &=\sum_{n=0}^\infty\left([n=0]+2a_{n-1}+3^{n}\right)x^n\\ &=1+\sum_{n=1}^\infty\left(2a_{n-1}+3^{n}\right)x^n\\ &=1+x\sum_{n=1}^\infty 2a_{n-1}x^{n-1}+\sum_{n=1}^\infty3^{n}x^n\\ &=1+2x\sum_{n=1}^\infty a_{n-1}x^{n-1}+\left(\sum_{n=0}^\infty3^{n}x^n\right)-1\\ &=2xF(x)+\frac {1}{1-3x}\\ \end{aligned}  整理,得
    F(x)=112x×113x=(i=02ixi)(j=03jxj)\begin{aligned} F(x)&=\frac{1}{1-2x}\times\frac1{1-3x}\\ &=\left(\sum_{i=0}^\infty2^ix^i\right)\left(\sum_{j=0}^\infty3^jx^j\right) \end{aligned}  因而 nn 次项系数为
    an=k=0n2k×3nk\begin{aligned}a_n&=\sum_{k=0}^n2^k\times 3^{n-k} \end{aligned}  可以发现,这是个等比数列,公比为 23\dfrac 23,因而有
    an=k=0n3n×(23)k=3nk=0n(23)k=3n×1(23)n+1123=3n+1×(1(23)n+1)=3n+1×(12n+13n+1)=3n+12n+1\begin{aligned} a_n&=\sum_{k=0}^n3^n\times \left(\frac 23\right)^k\\ &=3^n\sum_{k=0}^n\left(\frac 23\right)^k\\ &=3^n\times \frac{1-\left({\large\frac 2 3}\right)^{n+1}}{1-{\large\frac 23}}\\ &=3^{n+1}\times\left( 1-\left({\frac 2 3}\right)^{n+1}\right)\\ &=3^{n+1}\times(1-\frac{2^{n+1}}{3^{n+1}})\\ &=3^{n+1}-2^{n+1}\\ \end{aligned}  因而满足递推式 a1=1,an=2an1+3na_1=1,a_n=2a_{n-1}+3^n 的数列的通项公式为 an=3n2na_n=3^{n}-2^{n}

    EGF\text{EGF} 变形

         对于 EGF\text{EGF},最重要的一条公式为:
    eax=i=1(aixii!)e^{ax}=\sum_{i=1}^\infty \left(\frac{a^ix^i}{i!}\right)
     令ex=i=0cixi(4)e^x=\sum_{i=0}^\infty c_ix^i\tag{4}  两边同时求导,得到:ex=i=1icixi1=i=0(i+1)ci+1xi\begin{aligned}e^x&=\sum_{i=1}^\infty i\cdot c_ix^{i-1}\\&=\sum_{i=0}^\infty (i+1)c_{i+1}x^{i}\end{aligned}  因而有:i=0cixi=i=0(i+1)ci+1xi\sum_{i=0}^\infty c_ix^i=\sum_{i=0}^\infty (i+1)c_{i+1}x^{i}  由于相等的两个多项式其相同次项前的系数相等,有:ci=(i+1)ci+1\begin{aligned}c_i&=(i+1)c_{i+1}\end{aligned}  等式两侧同时除以 (i+1)(i+1),得:ci+1=cii+1=c0(i+1)! \begin{aligned}c_{i+1} =\frac{c_i}{i+1}=\frac{c_0}{(i+1)!} \end{aligned}  回代 (4)(4) 式,得:ex=i=0c0i!xi=c0(i=0xii!)(5)\begin{aligned}e^{x}=\sum_{i=0}^\infty \frac{c_0}{i!}x^i=c_0\left(\sum_{i=0}^\infty \frac {x^i}{i!}\right)\tag{5} \end{aligned}  当 x=0x=0 时,有:
    1=e0=c0(i=00ii!)=c0(00+0)=c01=e^{0}=c_0\left(\sum_{i=0}^\infty \frac {0^i}{i!}\right)=c_0\left(0^0+0\right)=c_0  回代 (5)(5) 式,得:ex=i=0xii!e^x=\sum_{i=0}^\infty \frac{x^i}{i!}  令 x=axx=ax',则有:eaxi=0=aixii!e^{ax'}\sum_{i=0}^\infty=\frac{a^ix^i}{i!}  得证。


    1. 这是个对称的二元方程,由于 aabb 可以交换,因而这里只需要保留其中一个解即可。 ↩︎

    展开全文
  • 1、row format:数据行格式的声明,其声明的目的是为了让hive知道以什么方式处理行数据,以便让hive能够以正确的方式来处理文件中的行,并与表中的行对应起来。 2、delimited:指定哪些是分隔符,这些分隔符用于...

    文章目录

    HIVE介绍

    Hive是基于Hadoop的一个数据仓库工具,可以将结构化的数据文件映射为一张表,并提供类SQL查询功能。本质
    将HQL转化成MapReduce程序
    Hive在Hadoop生态中的位置如下图所示:
    在这里插入图片描述
    hive和hadoop的关系:
    1)Hive处理的数据存储在HDFS
    2)Hive分析数据底层的实现是MapReduce
    3)执行程序运行在Yarn上

    Hive的基本操作(在操作之前需要先启动hdfs(存储源数据)和mysql数据库(存储表结构))

    一、错误

    在这里插入图片描述
    seman 表示是一个无法解决的错误
    parse 表示是一个解析异常,修改完hql语句之后就能解决错误
    剩下其他错误需要通过查看日志来确定是什么错 cat /tmp/root/hive.log

    二、进入hive操作界面的两种方式

    2.1、直接输 hive 就可以进入
    2.2、beeline连接(连接hive的三种方式:cli,webGUI,beeline(JDBC/ODBC))界面比较美观
    一、启动后台
    hive --service hiveserver2
    netstat -ntlp | grep 10000 查看hiveserver2(端口号是10000) 是否启动
    二、进入客户端
    2.1、 beeline -u jdbc:hive2://localhost:10000 -n root hive2之后才有这个beeline启动
    !quit 退出客户端
    2.2、beeline -u jdbc:hive2://localhost:10000 -n root 启动的时候会报两个错
    一、错误
    在这里插入图片描述
    二、解决方法
    首先,要在hadoop的core-site.xml中添加如下配置:

    <property>
      <name>hadoop.proxyuser.root.hosts</name>
      <value>*</value>
    </property>
    <property>
      <name>hadoop.proxyuser.root.groups</name>
      <value>*</value>
    </property>
    

    修改之后需要在重新期待hadoop集群(start-all.sh)

    三、往表中添加数据的方式

    3.1 hive> insert into table stu values(1,“xss”);

    3.2、创建一个表然后再用load将数据加载进表对应的hdfs目录

    hive> create table stu(id int,name string)row format delimited fields terminated by ","; 
    

    1、row format:对数据行格式的声明,其声明的目的是为了让hive知道以什么方式处理行数据,以便让hive能够以正确的方式来处理文件中的行,并与表中的行对应起来。
    2、delimited:指定哪些是分隔符,这些分隔符用于将文本拆分成字段。
    3、fields terminated by ‘\t’:告诉hive,每个字段之间的分隔符是‘\t’,这必须与文件中字段的分隔符一致。如果不一致,虽然可以成功地将数据加载到hdfs上,但是通过select查询得到的字段值是不正确的,如为null。也就是说,hive在查询时会使用’\t’切分每一行,来获得字段的值。

    加载/root/data/student.txt 文件到student数据库表中。

    hive> load data local inpath ‘/root/data/student.txt‘ overwrite into table student;
    

    1、load data:加载外部数据到HDFS上。
    2、local:指加载的是本地文件系统中的数据,即所在Linux中的数据文件。如果没有这个参数,则是加载hdfs上的文件。
    3、inpath:文件所在的路径。如果没有使用local,则该参数的值应为hdfs的文件路径,即hdfs://192.168.100.40:9000/…
    4、overwrite:意思是加载数据并覆盖原有文件中的内容。如果不使用该关键字,则在原来的文件中追加新的数据。
    5、into table:指定要关联的hive。如果表关联错了,一般情况下不会报告异常,但后期的查询等操作的结果是非预期的。

    3.3、根据查询结果创建表(查询的结果会添加到新创建的表中,这种方式不能创建外部表) create as select

    create table if not exists student3
    as select id, name from student;
    
    

    3.4、创建表时通过Location指定加载数据路径,然后把txt文档传到设定的路径下

    1)创建表,并指定在hdfs上的位置
    hive (default)> create table if not exists student5(
                  id int, name string
                  )
                  row format delimited fields terminated by ‘\t’
                  location ‘/user/hive/warehouse/student5’;
    2)上传数据到hdfs上
    hive (default)> dfs -put /root/data/student.txt  /user/hive/warehouse/student5;
    3)查询数据
    hive (default)> select * from student5;
    
    

    3.5、根据 student 创建相同结构的表 student4

    create table if not exists student4 like student;
    

    3.6、通过查询结果添加进表 insert select

    insert into table stutwo select id,name from stu;
    

    四、在hive中操作haoop

    dfs -mkdir /s; 在hadoop上创建一个目录
    dfs -rm -r /s; 在hadoop上删除一个目录
    dfs -put /root/data/s.txt /s; 将s.txt 上传到hadoop的s目录下
    dfs -ls /; 查看haoop上的目录
    dfs -chmod 777 /user; 将haoop上的权限修改为777

    五、在hive中查看linux上的文件 在linux命令之前加感叹号

    !cat /root/s.txt

    六、在不进入hive的情况下在linux界面操作hive

    (1)“-e”不进入hive的交互窗口执行sql语句
    [root@master hive]$ bin/hive -e “select id from student;”
    (2)“-f”执行脚本中sql语句
    (1)在/root/data目录下创建hivef.sql文件
    [root@master ~]$ touch hivef.sql
    文件中写入正确的sql语句
    select *from student;
    (2)执行文件中的sql语句
    [root@master hive]$ bin/hive -f /root/data/hivef.sql
    (3)执行文件中的sql语句并将结果写入文件中 >是覆盖如果没有 hive_result.txt 则自己创建 >>是追加
    [root@master hive]$ bin/hive -f /root/data/hivef.sql > /root/data/hive_result.txt

    七、hive的数据类型

    7.1、基本数据类型

    在这里插入图片描述

    7.2、集合数据类型

    在这里插入图片描述
    集合数据类型演示例子:

    txt文档
    songsong,bingbing_lili,xiao song:18_xiaoxiao song:19,hui long guan_beijing
    yangyang,caicai_susu,xiao yang:18_xiaoxiao yang:19,chao yang_beijing
    建表语句

    create table json(
    name string,
    friends array<String>,
    children map<string,int>,
    address struct<street:string,city:string>
    )row format delimited fields terminated by ","
    collection items terminated by "_"
    map keys terminated by ":"
    lines terminated by "\n";
    

    字段解释:
    row format
    delimited
    fields terminated by ‘,’ — 列分隔符
    collection items terminated by ‘_’ –MAP STRUCT 和 ARRAY 的元素分隔符(数据分割符号)
    map keys terminated by ‘:’ — MAP中的key与value的分隔符
    lines terminated by ‘\n’; — 行分隔符
    取出songsong的朋友、孩子、城市

    hive (default)> select friends[1],children[‘xiao song’],address.city from test where name=”songsong”;
    

    八、数据库操作

    创建一个数据库,指定数据库在HDFS上存放的位置 location

    hive (default)> create database db_hive2 location ‘/db_hive2.db’;
    

    删除数据库

    drop database xss;
    

    ** 数据库不为空的时候强制删除数据庫 cascade **

    drop database xss cascade    
    

    查看數據庫信息

    desc database lesson;
    desc database extended db_hive;        詳細信息
    
    

    九、表操作

    创建表(可以吧JSON数据导进表的)

    数据
    {“student”:{“name”:“范阳”,“age”:17,“sex”:“M”},“sub_score”:[{“subject”:“语文”,“score”:87},{“subject”:“数学”,“score”:80},{“subject”:“英语”,“score”:80}]}
    表结构

    create table if not exists stu_josn_scores (
    student struct<name:string, age:int, sex:string>,
    sub_score array<struct<subject:string, score:int>>
    )
    row format serde "org.apache.hive.hcatalog.data.JsonSerDe";
    

    hive的lib包下面可以找到那个解析json的类
    在这里插入图片描述
    在这里插入图片描述

    显示表格信息

    在这里插入图片描述

    内部表 MANAGED_TABLE

    缺点:删除hive上的表则hdfs上的源数据也会被删除掉,不能共享hdfs上的源数据
    例:

    create table if not exists student2(
    id int, name string
    )
    row format delimited fields terminated by ‘\t’
    stored as textfile     文件存储格式
    location ‘/user/hive/warehouse/student2’;   内部表,删除表之后,数据也会随之删除
    

    外部表 EXTERNAL_TABLE

    相比内部表,它有关键词 (external),并且可以共享hdfs上的源数据,删除hive上的表则hdfs上的源数据也不会被删除掉,不影响
    例:

    create external table if not exists default.dept(
    deptno int,
    dname string,
    loc int
    )
    row format delimited fields terminated by ‘\t’;
    

    管理表和外部表的使用场景:
    每天将收集到的网站日志定期流入HDFS文本文件。在外部表(原始日志表)的基础上做大量的统计分析,用到的中间表、结果表使用内部表存储,数据通过SELECT+INSERT进入内部表

    分区表 当数据量比较大的时候可以缩小查找范围,从而提高查询效率

    创建一级分区表

    创建分区表的语法格式 只需要在小括号后面加 partitioned by( 条件 ) 就行

    hive (default)> create table dept_partition(
    deptno int, dname string, loc string
    )
    partitioned by (month string)       ****额外需要加的地方
    row format delimited fields terminated by ‘\t’;
    

    往分区表内加载数据 跟平常添加数据的区别是往分区表内添加数据需要在最后指定要添加进那个分区

    load data local inpath ‘/root/data/dept.txt’ into table default.dept_partition    partition(month=’201709′);
    

    查询分区表

    hive (default)> select * from dept_partition where month=’201709′;
    

    多分区联合查询

    hive (default)> select * from dept_partition where month=’201709′
    union
    select * from dept_partition where month=’201708′
    union
     select * from dept_partition where month=’201707′;
    

    增加分区
    添加单个分区
    hive (default)> alter table dept_partition add partition(month=’201706′) ;
    同时添加多个分区
    hive (default)> alter table dept_partition add partition(month=’201705′), partition(month=’201704′);
    删除分区
    删除单个分区
    hive (default)> alter table dept_partition drop partition (month=’201704′);
    同时删除多个分区
    hive (default)> alter table dept_partition drop partition (month=’201705′), partition (month=’201706′);
    查看分区表有多少分区
    hive> show partitions dept_partition;
    查看分区表结构
    hive> desc formatted dept_partition;

    创建二级分区表

    正常的加载数据

    语法格式

    create table par(id int,name string) partitioned by(month string,day string) row format delimited fields terminated by ",";
    

    往二级分区表内加载数据

     load data local inpath "/root/data/stu.txt" into table par partition(month="20201",day="29");
    

    查询二级分区表

    select * from par where month="20201" and day="29";
    

    把数据直接上传到分区目录上,让分区表和数据产生关联的两种方式。(前提是表定义的时候要有两级目录,既有month又有day)

    (1)方式一:上传数据后修复

    上传数据
    hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=201709/day=12;
    hive (default)> dfs -put /root/data/dept.txt  /user/hive/warehouse/dept_partition2/month=201709/day=12;
    查询数据(查询不到刚上传的数据)
    hive (default)> select * from dept_partition2 where month=’201709′ and day=’12’;
    执行修复命令
    hive> msck repair table dept_partition2;   ***执行完这条命令之后,才能查询出数据
    再次查询数据
    hive (default)> select * from dept_partition2 where month=’201709′ and day=’12’;
    

    (2)方式二:上传数据后添加分区

    上传数据
    hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=201709/day=11;
    hive (default)> dfs -put /root/data/dept.txt  /user/hive/warehouse/dept_partition2/month=201709/day=11;
    执行添加分区
    hive (default)> alter table dept_partition2 add partition(month=’201709′, day=’11’);
    查询数据
    hive (default)> select * from dept_partition2 where month=’201709′ and day=’11’;
    

    (3)方式三:上传数据后load数据到分区

    创建目录
    hive (default)> dfs -mkdir -p /user/hive/warehouse/dept_partition2/month=201709/day=10;
    hive (default)> dfs -put /root/data/dept.txt  /user/hive/warehouse/dept_partition2/month=201709/day=10;
    hive (default)> load data local inpath ‘/root/data/dept.txt’ into table dept_partition2 partition(month=’201709′,day=’10’);
    包含两个方面的内容:一是创建元数据;二是将数据文件上传到目录。如果分区表目录存在,则直接保存;如果不存在,创建分区表目录,然后上传数据。
    查询数据
    hive (default)> select * from dept_partition2 where month=’201709′ and day=’10’;
    

    十、数据导入

    一、向表中装载数据(Load)

    语法

    hive> load data [local] inpath ‘/root/data/student.txt’ [overwrite] into table table_name [partition (partcol1=val1,…)];
    

    (1)load data:表示加载数据
    (2)local:表示从本地加载数据到hive表;否则从HDFS加载数据到hive表
    (3)inpath:表示加载数据的路径
    (4)overwrite:表示覆盖表中已有数据,否则表示追加
    (5)into table:表示加载到哪张表
    (6)student:表示具体的表
    (7)partition:表示上传到指定分区

    二、通过查询语句向表中插入数据(Insert)

    1)创建一张分区表

    hive (default)> create table student(id int, name string) 
    partitioned by (month string) 
    row format 
    delimited 
    fields terminated by ‘\t’;
    

    2)基本插入数据

    hive (default)> insert into table  student partition(month=’201709′) values(1,’wangwu’);
    

    3)基本模式插入(根据单张表查询结果)

    hive (default)> insert overwrite table student partition(month=’201708′)
                 select id, name from student where month=’201709′;
    

    4)多插入模式(根据多张表查询结果)

    hive (default)> from student
                  insert overwrite table student partition(month=’201707′)
                  select id, name where month=’201709′
                  insert overwrite table student partition(month=’201706′)
                  select id, name where month=’201709′;
    

    三、查询语句中创建表并加载数据(As Select)

    根据查询结果创建表(查询的结果会添加到新创建的表中)

    create table if not exists student3
    as select id, name from student;
    

    四、创建表时通过Location指定加载数据路径

    1)创建表,并指定在hdfs上的位置

    hive (default)> create table if not exists student5(
                  id int, name string
                  )
                  row format delimited fields terminated by ‘\t’
                  location ‘/user/hive/warehouse/student5’;
    

    2)上传数据到hdfs上

    hive (default)> dfs -put /root/data/student.txt  /user/hive/warehouse/student5;
    

    3)查询数据

    hive (default)> select * from student5;
    

    五、Import数据到指定Hive表中

    注意:先用export导出后,再将数据导入。

    hive (default)> import table student2 partition(month=’201709′) from ‘/user/hive/warehouse/export/student’;
    

    十一、导出数据

    一、Insert导出

    1)将查询的结果导出到本地
    hive (default)> insert overwrite local directory ‘/root/data/export/student’ select * from student;
    如果没有指定分隔符,则使用Hive默认的分隔符:
    分隔符 描述

    \n 对于文本文件来说,每行都是一条记录,因此换行符可以分隔记录
    ^A(Ctrl+A) 用于分隔字段(列)。在CREATE TABLE语句中可以使用八进制编码\001表示
    ^B(Ctrl+B) 用于分隔ARRAY或者STRUCT中的元素,或用于MAP中键-值对之间的分隔。在CREATE TABLE语句中可以使用八进制编码\002表示
    ^C(Ctrl+C) 用于MAP中键和值之间的分隔。在CREATE TABLE语句中可以使用八进制编码\003表示

    2)将查询的结果格式化导出到本地

    hive (default)> insert overwrite local directory ‘/root/data/export/student1’
                 ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’ select * from student;
    

    3)将查询的结果导出到HDFS上(没有local)

    hive (default)> insert overwrite directory ‘/user/root/student2’
                 ROW FORMAT DELIMITED FIELDS TERMINATED BY ‘\t’
                 select * from student;
    

    二、hdfs命令导出到本地

    hive (default)> dfs -get /user/hive/warehouse/student/month=201709/000000_0 /root/data/export/student3.txt;

    三、Hive Shell 命令导出

    基本语法:(hive -f/-e 执行语句或者脚本 > file,即使用重定向)
    [root@master hive]$ bin/hive -e ‘select * from default.student;’ > /root/data/export/student4.txt;

    四、Export导出到HDFS上

    hive (default)> export table default.student to ‘/user/hive/warehouse/export/student’;

    十二、分桶表

    测试数据

    1001	ss1
    1002	ss2
    1003	ss3
    1004	ss4
    1005	ss5
    1006	ss6
    1007	ss7
    1008	ss8
    1009	ss9
    1010	ss10
    1011	ss11
    1012	ss12
    1013	ss13
    1014	ss14
    1015	ss15
    1016	ss16
    

    创建分桶表

    创建分桶表定义格式

    create table buck(id int, name string)
    clustered by(id) -- 括号不能省略
    into 4 buckets     --4是随意的,自己需要几个同就设置成几
    row format delimited fields terminated by ‘\t’;
    

    查看分桶表结构

    hive (default)> desc formatted stu_buck;
    Num Buckets:            4     
    

    往分桶表加载数据 大致分为三步

    一、先创建一个字段跟分桶表一样的表
    create table stu(id int, name string)
    row format delimited fields terminated by ‘\t’;
    二、向普通的stu表中导入数据
    load data local inpath ‘/root/data/student.txt’ into table stu;
    三、导入数据到分桶表,通过子查询的方式
    insert into table buck
    select id, name from stu;
    

    到hdfs上可以看到在stu_buck目录下有四个数据文件。

    在这里插入图片描述

    查询分桶表信息

    id%分桶数=桶号 然后每个id根据%桶数的余数,然后放到对应的桶中(这里定义的是4个桶 into 4 buckets ,所以只有0,1,2,3 这四个桶)

    select * from buck
    

    分桶表抽样查询

    hive (default)> select * from stu_buck tablesample(bucket x out of y on id);
    

    注意事项
    y必须是table总bucket数的倍数或者因子
    x表示从哪个bucket开始抽取

    总共抽一个桶或者小于1个桶的时候,简言之,公式就是从x号桶中取出(桶数/y)个桶中的数据
    select * from buck tablesample(bucket 2 out of 4 on id);
    注意:x的值必须小于等于y的值,否则

    要是抽一个桶以上或者两个桶的时候那么计算公式就不是(x,桶数/y)了,而是抽取第 x 个和第 x+y 个bucket的数据。
    select * from buck tablesample(bucket 2 out of 2 on id); 就意味着是抽取除 第2个桶和第 2+2 个桶

    十三、hive函数

    Order By 和 Sort By 的区别

    ORDER BY 对reducer处理过的结果集执行一个全局排序
    它和其他的SQL方言中的定义是一样的。其会对reducer处理过的结果集执行一个全局排序。这也就是说会有一个所有的数据都通过一个reducer进行处理的过程。对于大数据集,这个过程可能会消耗太过漫长的时间来执行。
    1)使用 ORDER BY 子句排序
    ASC(ascend): 升序(默认)
    DESC(descend): 降序
    2)ORDER BY 子句在SELECT语句的结尾。
    **Sort By(局部有序,全局无序),每个MapReduce内部排序, 在每个reducer中对数据进行排序,可以提高后面进行的全局排序的效率 **
    由于ORDER BY进行全局排序,性能会受到影响。因此,Hive增加了一个可供选择的方式,也就是SORT BY,它只会在每个reducer中对数据进行排序,也就是执行一个局部排序过程。这可以保证每个reducer的输出数据都是有序的(但并非全局有序)。这样可以提高后面进行的全局排序的效率。正是因为如此,SORT BY排序应该作用于多个reduce上,所以通常会在执行前将reduce的数目设置为大于1的数。
    1)设置reduce个数
    hive (default)> set mapreduce.job.reduces=3; set只对当前hive环境有影响,一旦hive退出了,下次再进入的时候就需要重新set 要想永远起作用就需要在hadoop的配置文件hive-site.xml中配置reducer数目
    2)查看设置reduce个数
    hive (default)> set mapreduce.job.reduces;

    分区排序(Distribute By) 多个reducer,分区排序要和局部排序结合使用

    Distribute By:类似MR中partition,进行分区,结合sort by使用。
    注意
    1、Hive要求DISTRIBUTE BY语句要写在SORT BY语句之前。
    2、对于distribute by进行测试,一定要分配多reduce进行处理,否则无法看到distribute by的效果。

    【案例实操】
    先按照部门编号分区,再按照员工编号降序排序。

    hive (default)> set mapreduce.job.reduces=3;
    hive (default)> insert overwrite local directory ‘/root/data/distribute-result’ select * from emp distribute by deptno sort by empno desc;
    

    Cluster By 当distribute by和sort by字段相同时,可以使用cluster by方式。(但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。)

    cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。
    1)以下两种写法等价
    hive (default)> select * from emp cluster by deptno;
    hive (default)> select * from emp distribute by deptno sort by deptno;
    注意:按照部门编号分区,不一定就是固定死的数值,可以是20号和30号部门分到一个分区里面去。

    聚合函数

    collect_set(name) array_contains(collect_set(course),“a”) if(array_contains(collect_set(course),“d”),1,0),

    collect_set: 用set将分组之后的name用 , 逗号拼接在一块,返回一个数组
    array_contains:判断用set组成的数组中是否包含a,包含的话就返回true否则返回false
    if(条件,1,2):如果条件满足就返回1否则返回0
    例题:
    需要文件

    1,a
    1,b
    1,c
    1,e
    2,a
    2,c
    2,d
    2,f
    3,a
    3,b
    3,c
    3,e
    

    题目要求
    在这里插入图片描述
    **解题代码

    select id,
    if(array_contains(collect_set(course),"a"),1,0),
    if(array_contains(collect_set(course),"b"),1,0),
    if(array_contains(collect_set(course),"c"),1,0),
    if(array_contains(collect_set(course),"d"),1,0),
    if(array_contains(collect_set(course),"e"),1,0),
    if(array_contains(collect_set(course),"f"),1,0) 
    from xk group by id;
    

    行转列 CONCAT(字符串A,",",字符串B) CONCAT_WS("|",collect_set( ))

    例题
    在这里插入图片描述
    需要文件

    孙悟空 白羊座 A
    大海 射手座 A
    宋宋 白羊座 B
    猪八戒 白羊座 A
    凤姐 射手座 A
    

    创建表及加载数据

     create table xkk(name string,con string,type string)row format delimited fields terminated by " " location "/user/hive/warehouse/xkk";
     
     dfs -put /root/data/xk.txt /user/hive/warehouse/xkk;
    

    解题SQL语句

     select a.ct,concat_ws("|",collect_set(a.name))
     from (
     select name,concat(con,",",type) as ct from xkk 
     ) as a 
     group by a.ct;
    

    相关函数说明
    CONCAT(string A/col, string B/col…):将输入的两个字符串用逗号拼接起来,各个参数之间用逗号隔开
    CONCAT_WS(separator, str1, str2,…):它是一个特殊形式的 CONCAT()。第一个参数是其后面参数间的分隔符。分隔符可以是与后面参数一样的字符串。如果分隔符是 NULL,返回值也将为 NULL。这个函数会跳过分隔符参数后的任何 NULL 和空字符串。分隔符将被加到被连接到字符串之间;
    COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。
    注意:使用CONCAT_WS后必须使用GROUP BY 子句,否则会报告如一错误:
    FAILED: SemanticException [Error 10025]: Line 3:7 Expression not in GROUP BY key ‘ct’

    列转行 lateral view explode(cate)

    在这里插入图片描述
    需要文件

    《疑犯追踪》	悬疑,动作,科幻,剧情
    《Lie to me》	悬疑,警匪,动作,心理,剧情
    《战狼2》	战争,动作,灾难
    

    创建表及加载数据

    create table movie(movie string,cate array<string>)row format delimited fields terminated by "\t" \
    collection items terminated by "," \
    location "/user/hive/warehouse/movie";
    
    dfs -put /root/data/xk.txt /user/hive/warehouse/movie;
    

    解题SQL语句

    select movie,tt from movie lateral view explode(cate) t as tt;
    

    ** 相关函数说明**
    LATERAL VIEW:
    用法:LATERAL VIEW udtf(expression) 表别名 AS 列别名
    解释:用于和split,explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
    EXPLODE(col):将hive某个列中复杂的array或者map结构拆分成多行。

    开窗函数 over() 一般旁边都跟一个聚合函数,两个共同使用

    写得好吗?如果觉得还不错点个赞吧^ _ ^

    展开全文
  • Hive--函数、窗口函数

    2020-12-18 11:29:58
    目录Hive--函数、窗口函数1 Hive--函数1.1 Hive 常用函数1.1.1 判空函数:nvl1.2 concat/concat_ws1.3 case when/if1.4 Hive--WC1.5 Hive--列转行1.6 Hive--行转列2 Hive--窗口函数2.1 LEAD/LAG2.2 FIRST_VALUE/LAST...
  • // 将字符串切分成单个字符的数组 ( 空格切分 ) val strLst: Array[String] = args(0).toString.split(" ") for(i ){ var tmp:Array[String] = new Array[String](1) tmp(0) = i // 输出:调用forward方法,...
  • hive的常见函数

    2019-01-16 09:46:00
    查看函数的介绍(必读): show functions ; #查看hive中的所有内置函数 desc function extended 函数名; #查看某个函数的详细介绍 1.hive中常见的内置函数 1)集合函数  创建数组   array(ele1,ele2,ele3) ...
  • 递归函数

    2015-02-12 15:06:32
    CONNECT BY {PRIOR 列名1=列名2|列名1=PRIOR 名2}  [START WITH];  其中:CONNECT BY子句说明每行数据将是按层次顺序检索,并规定将表中的数据连入树型结构的关系中。PRIORY 运算符必须放置在连接关系的...
  • javase-递归函数

    千次阅读 2018-03-26 12:37:44
    1、递归:在一个方法直接或者间接的调用自己 直接调用:f函数在自身中调用f函数;间接调用f1函数调用f2函数,在f2内部又调用f1的...2)找出数学规律----最简单的规律(不要复杂化,不要数列的解决思维)(找出...
  • 生成函数(母函数)——目前最全的讲解

    万次阅读 多人点赞 2018-10-27 20:38:24
    生成函数(母函数) 什么是生成函数:wiki上的介绍 在数学中,某个序列(an)n∈N\large {\displaystyle (a_{n})_{n\in \mathbb {N} }}(an​)n∈N​ 的母函数(又称生成函数,英语:Generating function)是一种形式幂...
  • sql常用函数

    2020-01-17 22:39:01
    sql相关函数学习 AVG函数 定义和用法: AVG 函数返回数值列的平均值。NULL 值不包括在计算中。 语法: SELECT AVG(column_name) FROM table_name 注意:NULL值不参与运算 FIRST()函数 定义和用法: FIRST() 函数...
  • hive中函数

    2020-06-10 11:49:28
    常使用过哪些系统函数 avg max min sum count distinct date_format函数(根据格式整理日期) date_add函数(加减日期)date_sub加减日期 date_diff计算日期之间相差的天数 next_day函数(当前天的下周一、二。...
  • 作者:自为风月马前卒链接:...我最开始学的时候也是在这里蒙了好久,直到看到了朱全民老师的课件,才真正的理解了生成函数的本质——处理排列组合问题的有利工具,而不是简单的 的指标代换。所以这篇文...
  • 浅析生成函数

    2019-05-04 20:02:00
    有些组合数学的东西看不懂主要...生成函数(母函数):数列$\{ a_0,a_1,a_2,...,a_n\}$,维护的一个多项式$G(x) = \sum\limits_{i=0}^{n} a_i x^i$ 打个比方说,今天心血来潮想一个多项式来表示一个序列$ \{ 1...
  • Hive 内置函数

    2021-06-03 10:20:22
    九、Hive 内置函数 1.nvl 2.case when then else end 3.concat 4.concat_ws 5.collect_set 6.collect_list 7.explode + lateral view侧写表 8.grouping sets 多维分析 9.over 开窗函数 10.rank 11.dense_rank 12.row...
  • Hive常用函数

    2021-05-12 21:58:32
    Hive常用函数 1、常用日期函数 unix_timestamp ()::返回当前或指定日期的时间戳 select unix_timestamp(); # 返回当前时间戳 select unix_timestamp('2021-05-10','yy-MM-dd'); # 返回指定日期的时间戳 from_unix...
  • Python入门之常用函数

    2019-05-28 16:51:40
    title() 函数。返回"标题化"的字符串,就是说所有单词的首个字母转化为大写,其余字母均为小写。 str.title() upper() / lower() 函数。返回全部转为大写/小写字母的字符串。 str.upper() strip() 函数。删除...
  • Hive 自带函数

    2021-04-29 16:21:29
    acos 反余弦函数 定义域 [-1,1] x在其它区间的话 得到的值是null 值域 [0,pi] 实例: acos(-1) = 3.141592653589793 acos(1)=0.0 add_months select add_months('2020-01-01',3) 2020-04-01 and 作为...
  • Hive中的函数

    2020-03-05 13:59:57
    函数分类 UDF user-define-function:用户定义函数 进一条出一条 UDAF user-define-aggregation-function:用户定义聚合函数 进多条出一条 如:max min avg sum count UDTF user-define-table-function:用户定义...
  • SSD深度学习模型工件裂纹进行检测

    千次阅读 热门讨论 2018-10-28 10:56:35
    # 长宽比例对应在aspect_ratios中,不同scale采样的anchor数量和比例也不相同 scales_coco = [0.07, 0.15, 0.33, 0.51, 0.69, 0.87, 1.05] # The anchor box scaling factors used in the original SSD300 for the ...
  • 转载 C++构造函数初始化列表与构造函数中的赋值的区别 ...
  • 在梯度缓冲层的生长过程中,三甲基铝(TMAl)的流量根据一系列函数逐渐降低,而三甲基镓(TMGa)的流量以相同的线性函数增加。 因此,这些渐变的AlGaN层显示出不同的Al分布,这可以通过高分辨率X射线衍射(HR-XRD)...