广电用户画像分析之根据用户行为数据进行筛选与标签添加

2023-11-17

在数据处理和分析领域,我们经常需要根据用户的行为数据进行筛选和标签添加,以便更好地理解用户行为和偏好。在本篇博客中,我们将介绍两个示例,展示如何根据用户的收视行为数据和订单信息进行数据处理和分析。

前情提要:

数据集分析:
广电用户画像分析之探索各个表中的记录数和字段phone_no的空值数 )
数据预处理:
广电用户画像分析之数据基本分析与预处理)

根据用户收视行为数据中地区和语言偏好筛选数据

完整代码:


package code.userprint

import org.apache.spark.sql.SparkSession

object MediaPrint {
  def main(args: Array[String]): Unit = {
    System.setProperty("HADOOP_USER_NAME", "root")
    val spark = SparkSession.builder().appName("media")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()
    //
    spark.sparkContext.setLogLevel("WARN")

    val media = spark.table("Processdata.media_index")
    import org.apache.spark.sql.functions._

//    media.selectExpr("max(end_time) as max_month")
//    .selectExpr("add_months(max_month,-3) as beforeTime").show() // 2018-04-30

    media.filter("end_time > '2018-04-30'")
    .groupBy("phone_no","audio_lang").agg(sum("duration")/(1000*60*60)/3 as "avgduration")
    .filter("avgduration > 5").select("phone_no","audio_lang")
    .write.mode("overwrite").saveAsTable("userPrint.languagePrint")

    media.filter("end_time > '2018-04-30'")
      .groupBy("phone_no","region").agg(sum("duration")/(1000*60*60)/3 as "avgDuration")
      .filter("avgDuration > 5").select("phone_no","region")
      .write.mode("overwrite").saveAsTable("userPrint.regionPrint")

  }
}

该类的目的是根据用户观看媒体的语言和地区信息,统计其在过去三个月内的平均观看时长,并筛选出观看时长大于5小时的用户,将结果存储在两个不同的Hive表中,分别为languagePrint和regionPrint。

思路:

从表Processdata.media_index中读取数据,得到一个DataFrame对象media。

在media中筛选出end_time大于’2018-04-30’的记录。

按照phone_no和audio_lang进行分组,使用agg函数计算duration字段的总和,并将结果除以3(毫秒转换为小时),得到每月平均持续时间avgduration。

筛选出平均持续时间大于5小时的记录,选择phone_no和audio_lang两列。

将结果保存为名为languagePrint的Hive表。

再次在media中筛选出end_time大于’2018-04-30’的记录。

按照phone_no和region进行分组,使用agg函数计算duration字段的总和,并将结果除以3(毫秒转换为小时),得到每月平均持续时间avgDuration。

筛选出平均持续时间大于5小时的记录,选择phone_no和region两列。

将结果保存为名为regionPrint的Hive表。

核心代码:

val media = spark.table(“Processdata.media_index”)

media.filter(“end_time > ‘2018-04-30’”)

.groupBy(“phone_no”,“audio_lang”).agg(sum(“duration”)/(10006060)/3 as “avgduration”)

.filter(“avgduration > 5”).select(“phone_no”,“audio_lang”)

.write.mode(“overwrite”).saveAsTable(“userPrint.languagePrint”)

media.filter(“end_time > ‘2018-04-30’”)

.groupBy(“phone_no”,“region”).agg(sum(“duration”)/(10006060)/3 as “avgDuration”)

.filter(“avgDuration > 5”).select(“phone_no”,“region”)

.write.mode(“overwrite”).saveAsTable(“userPrint.regionPrint”)

根据订单信息筛选产品名称

完整代码:

package code.userprint

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.expressions.Window

object OfferName {
  def main(args: Array[String]): Unit = {
    System.setProperty("HADOOP_USER_NAME", "root")
    val spark = SparkSession.builder().appName("MediaAnalyse")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()
    //
    spark.sparkContext.setLogLevel("WARN")

    // 过滤 offername 不为空,且cost<=0
    val TVorder = spark.read.table("processData.order_index")
      .filter("offername is not null")
      .filter("cost > 0")
      // 筛选电视业务
      .filter("sm_name != '珠江宽频'")
    val BDorder = spark.read.table("processData.order_index")
      .filter("offername is not null")
      .filter("cost > 0")
      // 筛选宽带业务
      .filter("sm_name like '珠江宽频'")
    // 电视主销售品
    import org.apache.spark.sql.functions._
    val TVMainOffer = TVorder.filter("mode_time='Y' and offertype=0 and prodstatus='YY'")
      .select(col("phone_no"), col("offername"),
        // 以用户作为窗口分组的标准,再以 optdate 排序(根据排名),获取排名为 1 ,
        // 由于根据 optdate 进行降序排序,所以排名为 1 的即为 optdate 最大值
        row_number().over(Window.partitionBy("phone_no")
          .orderBy(desc("optdate"))) as "rn").filter("rn==1")
      .select(col("phone_no"), col("offername"))
    //      TVMainOffer.show()
    // 电视附属销售品
    val TVOffer = TVorder.filter("mode_time='Y' and offertype=0 and prodstatus='YY'")
      .select(col("phone_no"), col("offername"))
    //      TVOffer.show()
    // 宽带
    val BDDffer = BDorder.select(col("phone_no"), col("offername"),
      row_number().over(Window.partitionBy("phone_no")
        .orderBy(desc("optdate"))) as "rn").filter("rn==1")
      .select(col("phone_no"), col("offername"))
    //    BDDffer.show()
    // 拼接
        val TVOfferName = TVMainOffer.union(TVOffer).union(BDDffer).distinct()
//    val TVOfferName = TVMainOffer.union(TVOffer).union(BDDffer)
//    TVOfferName.show()
    TVOfferName.write.mode("overwrite").saveAsTable("userPrint.TVOfferName")


    // BDofferName (宽带产品构建)
    val BDOfferordeResult = BDorder.select(col("phone_no"), col("prodname"),
      row_number().over(Window.partitionBy("phone_no")
        .orderBy(desc("optdate"))) as "rn").filter("rn==1")
      .select(col("phone_no"), col("prodname"))
    BDOfferordeResult.write.mode("overwrite").saveAsTable("userPrint.BDOfferName")
  }
}

该类的目的是创建一个消费者标签(Consumer Label)。它通过读取名为mmconsume_billevents的表中的数据,根据字段"phone_no"和"fee_code"进行去重,然后使用自定义的函数consumerLabel为每个消费者分配一个标签,最后将结果保存到名为consumerLabel的表中。

思路:

读取数据:使用spark.read.table()方法从表processData.order_index中读取数据,并将其分别赋值给TVorder和BDorder两个变量。

过滤数据:对TVorder和BDorder进行过滤操作,筛选出满足条件的数据集。可以使用filter()方法和SQL表达式来实现条件过滤。

电视业务处理:

主销售品:对TVorder进行条件筛选,选择mode_time=‘Y’、offertype=0和prodstatus='YY’的数据,并按phone_no分组,按optdate降序排序,使用窗口函数row_number()获取每组中排名为1的最新数据,将结果命名为TVMainOffer。

附属销售品:对TVorder进行条件筛选,选择mode_time=‘Y’、offertype=0和prodstatus='YY’的数据,并提取phone_no和offername字段,将结果命名为TVOffer。

宽带业务处理:

宽带销售品:对BDorder进行条件筛选,选择sm_name like '珠江宽频’的数据,并按phone_no分组,按optdate降序排序,使用窗口函数row_number()获取每组中排名为1的最新数据,将结果命名为BDDffer。

合并数据:将TVMainOffer、TVOffer和BDDffer三个数据集进行合并,可以使用union()方法实现,并去重,将结果命名为TVOfferName。

保存结果:将TVOfferName数据集保存为名为TVOfferName的Hive表,使用write.mode(“overwrite”).saveAsTable(“userPrint.TVOfferName”)实现。

宽带销售品保存:对于宽带业务,根据条件筛选出最新的销售品名称数据集,将结果命名为BDOfferordeResult,然后将其保存为名为BDOfferName的Hive表,使用write.mode(“overwrite”).saveAsTable(“userPrint.BDOfferName”)实现。

核心代码:

从表processData.order_index中读取数据,并进行过滤操作,筛选出满足条件的数据集。

val TVorder = spark.read.table(“processData.order_index”)

.filter(“offername is not null”)

.filter(“cost > 0”)

.filter(“sm_name != ‘珠江宽频’”)

val BDorder = spark.read.table(“processData.order_index”)

.filter(“offername is not null”)

.filter(“cost > 0”)

.filter(“sm_name like ‘珠江宽频’”)

针对电视业务,根据一定的条件筛选出主销售品和附属销售品,并获取最新的销售品名称,构建TVMainOffer和TVOffer数据集。

val TVMainOffer = TVorder.filter(“mode_time=‘Y’ and offertype=0 and prodstatus=‘YY’”)

.select(col(“phone_no”), col(“offername”), row_number().over(Window.partitionBy(“phone_no”).orderBy(desc(“optdate”))) as “rn”)

.filter(“rn==1”)

.select(col(“phone_no”), col(“offername”))

val TVOffer = TVorder.filter(“mode_time=‘Y’ and offertype=0 and prodstatus=‘YY’”)

.select(col(“phone_no”), col(“offername”))

针对宽带业务,根据一定的条件筛选出销售品,并获取最新的销售品名称,构建BDDffer数据集。

val BDDffer = BDorder.select(col(“phone_no”), col(“offername”), row_number().over(Window.partitionBy(“phone_no”).orderBy(desc(“optdate”))) as “rn”)

.filter(“rn==1”)

.select(col(“phone_no”), col(“offername”))

将TVMainOffer、TVOffer和BDDffer三个数据集进行合并,并去重,得到最终的销售品名称数据集TVOfferName。将TVOfferName数据集保存为名为TVOfferName的Hive表。针对宽带业务,根据一定的条件筛选出销售品,并获取最新的销售品名称,构建BDOfferordeResult数据集。

val TVOfferName = TVMainOffer.union(TVOffer).union(BDDffer).distinct()

TVOfferName.write.mode(“overwrite”).saveAsTable(“userPrint.TVOfferName”)

val BDOfferordeResult = BDorder.select(col(“phone_no”), col(“prodname”), row_number().over(Window.partitionBy(“phone_no”).orderBy(desc(“optdate”))) as “rn”)

.filter(“rn==1”)

.select(col(“phone_no”), col(“prodname”))

根据业务名称和入网程度添加标签

完整代码

package code.userprint

import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.expressions.Window
import org.apache.spark.sql.functions._
object UserMesgPrint {
  def main(args: Array[String]): Unit = {
    System.setProperty("HADOOP_USER_NAME", "root")
    val spark = SparkSession.builder().appName("Process")
      .master("local[*]")
      .enableHiveSupport()
      .getOrCreate()
    //
    spark.sparkContext.setLogLevel("WARN")

    val userMsg = spark.table("processData.mediamatch_usermsg")

    // 业务品牌
    userMsg.filter("sm_code != 'a0' and sm_code != 'b1'")
      .select("phone_no","sm_name")
      .write.mode("overwrite").saveAsTable("userprint.ProductOffer")

    val TV = spark.read.table("processData.mediamatch_usermsg")
      // 筛选电视业务
      .filter("sm_name != '珠江宽频'")
    val BD = spark.read.table("processData.mediamatch_usermsg")
      // 筛选电视业务
      .filter("sm_name like '珠江宽频'")
      .filter("sm_code == 'b0'")
      .filter("force like '宽带生效'")

    // 用户电视入网
    val TVOpenTime = TV.select(col("phone_no"),col("open_time"),
      row_number().over(Window.partitionBy("phone_no")
        .orderBy(desc("open_time") )) as "rn")
      .filter("rn==1")
      .select(col("phone_no"),col("open_time"))
    TVOpenTime.show()
    val TVtime = TVOpenTime.withColumn("T",months_between(from_unixtime(unix_timestamp(),"yyyy-MM-dd HH:mm:ss"),col("open_time")))
    TVtime.show()

    // 用户电视入网标签构建
    val TVLabelUdf = udf((x:Double)=>TVLabel(x))
    TVtime.withColumn("TVLabel",TVLabelUdf(col("T"))).write.mode("overwrite").saveAsTable("userPrint.TVUseLabel")

    // 用户宽带入网
    val BDOpenTime = BD.select(col("phone_no"),col("open_time"),
      row_number().over(Window.partitionBy("phone_no")
        .orderBy(desc("open_time") )) as "rn")
      .filter("rn==1")
      .select(col("phone_no"),col("open_time"))
    BDOpenTime.show()
    val BDtime = BDOpenTime.withColumn("T",months_between(from_unixtime(unix_timestamp(),"yyyy-MM-dd HH:mm:ss"),col("open_time")))
    BDtime.show()

    // 用户宽带入网标签构建
    val BDLabelUdf = udf((x:Double)=>BDLabel(x))
    BDtime.withColumn("BDLabel",BDLabelUdf(col("T"))).write.mode("overwrite").saveAsTable("userPrint.BDUseLabel")


  }
  def TVLabel(T:Double): String = {
    if (T > 6) {
      "老用户"
    } else if (T < 3) {
      "新用户"
    } else {
      "中等用户"
    }
  }
    def BDLabel(T:Double): String ={
      if (T>4){
        "老用户"
      }else if(T<=2){
        "新用户"
      }else{
        "中等用户"
      }
  }
}

该类的目的是根据用户的电视业务和宽带业务数据,进行数据处理和分析,以实现以下核心目标:

(1)业务品牌处理:将用户的业务品牌数据进行筛选和处理,提取出符合条件的业务品牌信息,并保存到指定的表中。

(2)电视业务处理:

提取用户的电视业务数据。

计算每个用户的电视入网时间,并与当前时间进行比较,得出入网时长。

根据入网时长,对用户进行分类标记,划分为新用户、老用户和中等用户,并将结果保存到指定的表中。

(3)宽带业务处理:

提取用户的宽带业务数据。

计算每个用户的宽带入网时间,并与当前时间进行比较,得出入网时长。

根据入网时长,对用户进行分类标记,划分为新用户、老用户和中等用户,并将结果保存到指定的表中。

思路:

读取数据:使用spark.table()方法从表processData.mediamatch_usermsg中读取数据,并将其赋值给userMsg变量。

业务品牌处理:对userMsg进行条件筛选,去除sm_code为’a0’和’b1’的数据,然后选择phone_no和sm_name字段,将结果保存为名为ProductOffer的Hive表。

电视业务处理:

(1)数据筛选:对userMsg进行条件筛选,选择sm_name不等于’珠江宽频’的数据,并将结果赋值给TV变量。

(2)用户电视入网时间:使用窗口函数row_number()和desc(“open_time”)对TV进行分组排序,获取每个用户的最新入网时间,并将结果命名为TVOpenTime。

(3)计算入网时长:使用函数months_between()计算当前时间和入网时间之间的月份差,并将结果命名为T。

(4)用户电视入网标签构建:定义TVLabel函数,根据入网时长T的值判断用户的入网标签,返回相应的标签字符串。

(5)将入网时间和入网标签合并,并将结果保存为名为TVUseLabel的Hive表。

宽带业务处理:

(1)数据筛选:对userMsg进行条件筛选,选择sm_name为’珠江宽频’、sm_code为’b0’、force为’宽带生效’的数据,并将结果赋值给BD变量。

(2)用户宽带入网时间:使用窗口函数row_number()和desc(“open_time”)对BD进行分组排序,获取每个用户的最新入网时间,并将结果命名为BDOpenTime。

(3)计算入网时长:使用函数months_between()计算当前时间和入网时间之间的月份差,并将结果命名为T。

(4)用户宽带入网标签构建:定义BDLabel函数,根据入网时长T的值判断用户的入网标签,返回相应的标签字符串。

(5)将入网时间和入网标签合并,并将结果保存为名为BDUseLabel的Hive表。

核心代码:

从电视业务数据筛选和入网时间计算:

val TV = spark.read.table(“processData.mediamatch_usermsg”)

.filter(“sm_name != ‘珠江宽频’”)

val TVOpenTime = TV.select(col(“phone_no”), col(“open_time”),

row_number().over(Window.partitionBy(“phone_no”).orderBy(desc(“open_time”))) as “rn”)

.filter(“rn==1”)

.select(col(“phone_no”), col(“open_time”))

val TVtime = TVOpenTime.withColumn(“T”, months_between(from_unixtime(unix_timestamp(), “yyyy-MM-dd HH:mm:ss”), col(“open_time”)))


这段代码首先从输入数据中选择电视业务数据,并筛选出符合条件的数据。然后,通过窗口函数和排序操作,计算每个用户的最早入网时间,并提取出用户手机号和入网时间。最后,利用当前时间和入网时间计算出用户的入网时长。

电视业务用户标签构建和结果保存:

val TVLabelUdf = udf((x: Double) => TVLabel(x))

TVtime.withColumn(“TVLabel”, TVLabelUdf(col(“T”))).write.mode(“overwrite”).saveAsTable(“userPrint.TVUseLabel”)


这段代码定义了一个用户自定义函数 TVLabelUdf,用于根据入网时长对用户进行分类标记。然后,将入网时间和分类标记列添加到数据集中,并将结果保存到指定的表中。

宽带业务数据筛选和入网时间计算:

val BD = spark.read.table(“processData.mediamatch_usermsg”)

.filter(“sm_name like ‘珠江宽频’”)

.filter(“sm_code == ‘b0’”)

.filter(“force like ‘宽带生效’”)

val BDOpenTime = BD.select(col(“phone_no”), col(“open_time”),

row_number().over(Window.partitionBy(“phone_no”).orderBy(desc(“open_time”))) as “rn”)

.filter(“rn==1”)

.select(col(“phone_no”), col(“open_time”))

val BDtime = BDOpenTime.withColumn(“T”, months_between(from_unixtime(unix_timestamp(), “yyyy-MM-dd HH:mm:ss”), col(“open_time”)))


这段代码和第一段代码类似,只是针对宽带业务数据进行了筛选,并计算了每个用户的最早入网时间和入网时长。

宽带业务用户标签构建和结果保存:

val BDLabelUdf = udf((x: Double) => BDLabel(x))

BDtime.withColumn(“BDLabel”, BDLabelUdf(col(“T”))).write.mode(“overwrite”).saveAsTable(“userPrint.BDUseLabel”)

这段代码也类似于第二段代码,定义了一个用户自定义函数 BDLabelUdf,用于根据入网时长对宽带用户进行分类标记。然后,将入网时间和分类标记列添加到数据集中,并将结果保存到指定的表中。

以上是核心代码的简要介绍,分别展示了电视业务数据的处理和标记以及宽带业务数据的处理和标记。每段代码都有相应的文字介绍说明其功能和操作。

遇到的一些问题:

长时间运行不出结果:
运行OfferName程序时出现长时间不输出也不结束的阻塞情况.具体情况如下图所示:

image.png
可能是Windows下内存不足,而在虚拟机里运行时因为虚拟机使用的是虚拟内存,相对Windows的内存空间更大,因此解决方式就是放在虚拟机中运行.

而手动中断后再次运行,会报错报错说此hive表已存在,但在命令行里去show tables;是找不到这个表的.虽然这表没有建立,但表的映射文件已经建立,此时是需要删除映射即可:

hdfs dfs -rm -r hdfs://node01:9000/hive/warehouse/userprint.db/tvoffername

回归原本的问题,解决方式为将程序打包放在虚拟机里运行.

打包流程如下图所示:

image.png

image.png

image.png

image.png

image.png
改名并上传到/opt然后运行.运行指令为:
spark-submit --master spark://master:7077 --class code.userprint.OfferName /opt/scala.jar

检查是否运行成功,查看表里是否生成了数据,成功结果如下图所示:

image.png

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

广电用户画像分析之根据用户行为数据进行筛选与标签添加 的相关文章

  • Hadoop安装问题:

    我跟着this http www bogotobogo com Hadoop BigData hadoop Install on ubuntu single node cluster phpHadoop 安装教程 不幸的是 当我运行全部启动
  • 带尖括号 (<>) 的方法

    方法名称中是否可以有尖括号 例如 class Foo ind1 Int ind2 Int var v new Foo 1 2 v 1 3 updates ind1 v lt 1 gt 4 updates ind2 真实情况显然比这更复杂 我
  • 如何使用 Spark 执行插入覆盖?

    我正在尝试将我们的 ETL Hive 脚本之一转换为 Spark 其中 Hive ETL 脚本维护一个表 其中需要在每晚新同步之前删除部分数据 Hive ETL 使用插入覆盖的方式将主表删除超过 3 天的数据 基本上创建一个临时表 其中的数
  • Spark 上的 Hive 2.1.1 - 我应该使用哪个版本的 Spark

    我在跑蜂巢2 1 1 Ubuntu 16 04 上的 hadoop 2 7 3 根据Hive on Spark 入门 https cwiki apache org confluence display Hive Hive on Spark
  • 将案例类传递给函数参数

    抱歉问了一个简单的问题 我想将案例类传递给函数参数 并且想在函数内部进一步使用它 到目前为止我已经尝试过这个TypeTag and ClassTag但由于某种原因 我无法正确使用它 或者可能是我没有看到正确的位置 用例与此类似 case c
  • 模式匹配中使用的抽象类型的类型不匹配

    此代码编译时出现错误 def f1 T e T T e match case i Int gt i case b Boolean gt b type mismatch found i type with underlying type In
  • 我们可以在比赛中重用后卫内部的中间变量吗?

    说我有方法foo as def foo i Int Option Int some code 现在我想在一个Seq of Int如下 Seq 1 2 map case int gt foo int collect case Some int
  • 计算行的排名

    我想根据一个字段对用户 ID 进行排名 对于相同的字段值 排名应该相同 该数据位于 Hive 表中 e g user value a 5 b 10 c 5 d 6 Rank a 1 c 1 d 3 b 4 我怎样才能做到这一点 可以使用ra
  • 对于值类型,asInstanceOf[X] 和 toX 之间有什么区别吗?

    我使用 IntelliJ 将 Java 代码转换为 Scala 代码的功能 通常效果很好 看来 IntelliJ 用调用替换了所有强制转换asInstanceOf 是否有任何有效的用法asInstanceOf Int asInstanceO
  • JavaFx ComboBox 绑定混乱

    我有一个 I18N 实现 它通过属性绑定 JavaFX UI 元素 例如 def translateLabel l Label key String args Any Unit l textProperty bind createStrin
  • 如何更改 SparkContext.sparkUser() 设置(在 pyspark 中)?

    我是新来的Spark and pyspark 我使用 pyspark 之后我rdd处理中 我试图将其保存到hdfs使用saveAsTextfile 功能 但我得到一个 没有权限 错误消息 因为 pyspark 尝试写入hdfs使用我的本地帐
  • 如何在 Apache Spark 中基于列的子集实现“ except ”?

    我正在 Spark 中使用两个模式 table1 and table2 scala gt table1 printSchema root user id long nullable true item id long nullable tr
  • Scala SBT 和 JNI 库

    我正在编写一个简单的应用程序Scala通过以下方式使用 leveldb 数据库leveldbjni图书馆 我的build sbt文件看起来像这样 name Whatever version 1 0 scalaVersion 2 10 2 l
  • Scala:获取 Map.head 元素的键(和值)

    让我们想象一下以下不可变的 Map val foo Map 10 ten 100 one hundred 我想获得第一个元素的密钥 foo head获取第一个元素 但接下来呢 我还想要这个元素的值 即 十 设置键 值对 val key va
  • 如何使用 Scala 在 Spark 中漂亮地打印 JSON 数据帧?

    我有一个数据帧 我想将其作为有效的 json 写入 json 文件 我当前的代码如下所示 val df DataFrame myFun df toJSON saveAsTextFile myFile json 输出的格式为 如何将文件内容组
  • 加特林负载测试期间编译错误

    我正在尝试编写一个模拟 并且希望能够运行该模拟 我在尝试 mvn gatling execute 时遇到错误 我的 pom 有以下依赖项
  • 在 Scala 中调用反射案例类构造函数

    我可以通过静态反射获取案例类的默认构造函数 val symbol currentMirror classSymbol myObj getClass typeSignature typeSymbol asClass val ctor symb
  • 选项包装值是一个好的模式吗?

    我最近写了以下 Scala 代码 val f File pretend this file came from somewhere val foo toFoo io Source fromFile f mkString 我真的不喜欢这种方式
  • Scala:尝试 .getOrElse 与 if/else

    我是一名相当新的 Scala 开发人员 我是一名经验丰富的 Java 开发人员 到目前为止 我一直很喜欢 Scala 的简单性 我真的很喜欢函数式结构 而且它们常常迫使你编写更简洁的代码 然而最近我注意到 由于舒适性和简单性 我最终使用了在
  • 如何将Hive数据表迁移到MySql?

    我想知道如何将日期从 Hive 转移到 MySQL 我看过有关如何将 Hive 数据移动到 Amazon DynamoDB 的示例 但没有看到有关如何将 Hive 数据移动到 MySQL 等 RDBMS 的示例 这是我在 DynamoDB

随机推荐

  • 自然对数e的来历

    e是自然对数的底数 是一个无限不循环小数 其值是2 71828 是这样定义的 当n gt 时 1 1 n n的极限 注 x y表示x的y次方 随着n的增大 底数越来越接近1 而指数趋向无穷大 那结果到底是趋向于1还是无穷大呢 其实 是趋向于
  • win10与Linux虚拟机进行文件共享

    由于工作需要使用到linux虚拟机 为了实现win10与Linux虚拟机进行文件共享 分享教程如下 1 在windows系统中设置文件共享 设置过程参考我之前的文章 局域网内共享文件夹 2 虚拟机设置共享文件夹 1 设置 gt 共享文件夹
  • openGLAPI之glPolygonOffset

    openGL系列文章目录 文章目录 openGL系列文章目录 前言 一 glPolygonOffset官方文档 二 翻译 前言 openGLAPI之glPolygonOffset函数详解 一 glPolygonOffset官方文档 glPo
  • Android Dalvik VM GC options 命令控制参数

    else if strncmp argv i Xgc 5 0 In VM thread there is a register map for marking each stack item s status whether it is a
  • YOLOv3的交通灯检测,ROS下实现交通灯检测一样只需要相应文件夹下面修改之后编译即可

    YOLOv3的交通灯检测 效果 只是需要修改源码image c即可修改如下 这里的0和9就是只检测行人和交通灯 对应的数字设置自己想检测的类型 可以查看coco names文件下 完成修改之后 make clean make j 重新编译即
  • MySQL常用的数据类型

    MySQL的常用数据类型包括 整型 Int TINYINT SMALLINT MEDIUMINT INT BIGINT 浮点型 Float FLOAT DOUBLE DECIMAL 字符串类型 String CHAR VARCHAR TEX
  • SpringBoot项目用 jQuery webcam plugin实现调用摄像头拍照并保存图片

    参考博客 http www voidcn com article p oigngyvb kv html 自定义样式
  • visual studio附加选项/Tc、/Tp、/TC、/TP(指定源文件类型)

    Tc 选项指定 filename 为 C 源文件 即使它没有 c 扩展名 Tp 选项指定 filename 为 C 源文件 即使它没有 cpp 或 cxx 扩展名 选项和 filename 之间的空格是可选的 每个选项指定一个文件 若要指定
  • 多元函数可微性知识点总结

    这节的知识点也挺多 主要就是可微和偏导数存在的关系 偏导数 z f x y z对x或者y的偏导数就是把另一个当做常数求导 还算简单 判断可微性 必要条件 可以写成偏导数都存在 且可以写成 d z f x d
  • 【Matlab】simlink自动生成嵌入式代码配置教程

    1 简介 最近在学习模型开发 相较于普通嵌入式代码开发来说 其能够进行仿真 并且能够使各模块之间的逻辑更加清晰 simlink自动生成代码过程较多 因此记录下来 方便日后参考 2 搭建simlink相关模块 3 进行求解器等相关配置 配置求
  • C++的四种强制转换

    1 static cast 基本等价于隐式转换的一种类型转换运算符 以前是编译器自动隐式转换 static cast可使用于需要明确隐式转换的地方 c 中用static cast用来表示明确的转换 可以用于低风险的转换 整型和浮点型 字符与
  • 量化交易的历史

    学习目标 了解量化交易的发展历史 量化交易全球的发展历史 量化投资的产生 60年代 1969年 爱德华 索普利用他发明的 科学股票市场系统 实际上是一种股票权证定价模型 成立了第一个量化投资基金 索普也被称之为量化投资的鼻祖 量化投资的兴起
  • bWAPP通关记录(A1)

    安装 这里使用的是phpstudy进行搭建的 先下载bWAPP 打开解压之后bWAPP目录下的admin中的settings php 将数据库连接名和密码改为与phpmyadmin相同的 保存 浏览器访问 点击here 点击Login 默认
  • kuka机器人焊接编程入门教程_焊接机器人操作编程与应用教学.pptx

    ABB MOTOMAN FANUC KUKA OTC机器人 第1章 机器人基础知识 第1章 机器人基础知识 第1章 机器人基础知识 第1章 机器人基础知识 第1章 机器人基础知识 第1章 机器人基础知识 第1章 机器人基础知识 第1章 机器
  • 小程序的文件结构

    小程序的文件结构 我们利用微信开发者工具创建一个新的小程序 会有包含一个描述整体程序的app和多个描述各自页面的page 一个小程序的主体部分由三个文件组成 必须放在项目的根目录 gt app js 小程序的主要逻辑判断 gt gt app
  • 重新学防抖debounce和节流throttle,及react hook模式中防抖节流的实现方式和注意事项

    重学节流和防抖 防抖 概念理解 防抖就是指触发事件后在 n 秒内函数只能执行一次 如果在 n 秒内又触发了事件 则会重新计算函数执行时间 举例说明 坐电梯的时候 如果电梯检测到有人进来 触发事件 就会多等待 10 秒 此时如果又有人进来 1
  • 300 倍的性能提升!PieCloudDB Database 优化器「达奇」又出新“招”啦

    随着数字化进程的加快 全球数据量呈指数级增长 对数据库系统的性能提出了巨大的挑战 优化器作为数据库管理系统中的关键技术 对数据库性能和效率具有重要影响 它通过对用户的查询请求进行解析和优化来生成高效的执行计划 进而快速返回查询结果 然而 同
  • 嵌入式Linux——oops:根据oops信息,找到错误的产生位置以及函数的调用关系

    简介 本文主要介绍通过oops信息找到程序中出错位置的方法 并结合自己代码中的错误来讲解如何找到出错位置 同时还会介绍使用栈信息来推到函数间的调用关系 Linux内核 linux 2 6 22 6 所用开发板 JZ2440 V3 S3C24
  • 一、【React基础】React简介及基本使用

    文章目录 1 官网 2 特点 3 相关js库 4 基本使用 4 1 CODE 4 2 Result 用于动态构建用户界面的 JavaScript 库 只关注于视图 由Facebook开源 1 官网 英文官网 https reactjs or
  • 广电用户画像分析之根据用户行为数据进行筛选与标签添加

    在数据处理和分析领域 我们经常需要根据用户的行为数据进行筛选和标签添加 以便更好地理解用户行为和偏好 在本篇博客中 我们将介绍两个示例 展示如何根据用户的收视行为数据和订单信息进行数据处理和分析 前情提要 数据集分析 广电用户画像分析之探索