Spark 中数据转换及DataFrame数据的行转列

python数据分析-分组把DataFrame列转行 问题:遇到了一个问题是需要根据DataFrame中的某一列把对应另一列的数据由列转为行。 一、数据展示 a = pd.DataFrame({'name1':['a','a','b','c','b','a','b','a','c','c'], 'name2':['张三','张三','张三','李四','李四','李四','王五','王五','王五','王五']}) display(a) 二、数据展示 ... 阅读详情



1 DataFrame数据的行转列

1.1 需求

在做数据处理时我们可能会经常用到 Apache Spark 的 DataFrame来对数据进行处理,需要将行数据转成列数据来处理,例如一些指标数据一般会保存在KV类型数据库,根据几个字段作为key,将计算指标作为value保存起来,这样多个用户多个指标就会形成一个窄表,我们在使用这个数据时又希望按照每个用户来展示,将同一个用户的多个指标放到一行,这就需要将DataFrame数据进行行列转换,然后再通过Spark做进一步的处理,将最终的数据保存或提供给调用方。

Spark 中DataFrame数据的行转列需要用到Spark中的Pivot(透视),简单来说将用行Row形式的保存的数据转换为列Column形式的数据叫做透视;反之叫做逆透视。pivot算子在org.apache.spark.sql.RelationalGroupedDataset ➹类中,主要有如下6个重载的方法,查看这个方法源码的注释,我们可以看到这个方法是在Spark 1.6.0开始引入的(前4个是1.6.0之后,后2个是从2.4.0之后),而且建议我们最好指定第二个参数(列字段集合),否则效率会很低。

/**
   * Pivots a column of the current `DataFrame` and performs the specified aggregation.
   * There are two versions of pivot function: one that requires the caller to specify the list
   * of distinct values to pivot on, and one that does not. The latter is more concise but less
   * efficient, because Spark needs to first compute the list of distinct values internally.
   *
   * {{{
   *   // Compute the sum of earnings for each year by course with each course as a separate column
   *   df.groupBy("year").pivot("course", Seq("dotNET", "Java")).sum("earnings")
   *
   *   // Or without specifying column values (less efficient)
   *   df.groupBy("year").pivot("course").sum("earnings")
   * }}}
   *
   * @param pivotColumn Name of the column to pivot.
   * @param values List of values that will be translated to columns in the output DataFrame.
   * @since 1.6.0
   */

在这里插入图片描述

1.2 准备数据

例如现在有如下销售的不同类目的各个季度的销售额的数据,第一列数据为商品类目,第二列是季度:第一季度Q1、第二季度Q2、第三季度Q3、第四季度Q4,第三列是销售额单位为万元。

import org.apache.spark.sql.Row
import org.apache.spark.sql.types._

object DF_Data {
  val scc = new SparkConfClass()

  /**
    *  category|  quarter|  sales
    *  种类 | 季度 | 销售额
    */
  val store_sales = scc.getSc.parallelize(Array(
     "Books|Q4|4.66",
    "Books|Q1|1.58",
    "Books|Q3|2.84",
    "Books|Q2|1.50",
    "Women|Q1|1.41",
    "Women|Q2|1.36",
    "Women|Q3|2.54",
    "Women|Q4|4.16",
    "Music|Q1|1.50",
    "Music|Q2|1.44",
    "Music|Q3|2.66",
    "Music|Q4|4.36",
    "Children|Q1|1.54",
    "Children|Q2|1.46",
    "Children|Q3|2.74",
    "Children|Q4|4.51",
    "Sports|Q1|1.47",
    "Sports|Q2|1.40",
    "Sports|Q3|2.62",
    "Sports|Q4|4.30",
    "Shoes|Q1|1.51",
    "Shoes|Q2|1.48",
    "Shoes|Q3|2.68",
    "Shoes|Q4|4.46",
    "Jewelry|Q1|1.45",
    "Jewelry|Q2|1.39",
    "Jewelry|Q3|2.59",
    "Jewelry|Q4|4.25",
//    "null|Q1|0.04",
    "null|Q2|0.04",
//    "null|Q3|0.07",
    "null|Q4|0.13",
    "Electronics|Q1|1.56",
    "Electronics|Q2|1.49",
    "Electronics|Q3|2.77",
    "Electronics|Q4|4.57",
    "Home|Q1|1.57",
    "Home|Q2|1.51",
    "Home|Q3|2.79",
    "Home|Q4|4.60",
    "Men|Q1|1.60",
    "Men|Q2|1.54",
    "Men|Q3|2.86",
    "Men|Q4|4.71"
  ))
  val schemaStoreSales = StructType(
    "category|quarter".split("\\|")
      .map(column => StructField(column, StringType, true))
  ).add("sales", DoubleType, true)
  val store_salesRDDRows = store_sales.map(_.split("\\|"))
    .map(line => Row(
      line(0).trim,
      line(1).trim,
      line(2).trim.toDouble
    ))
}

上述代码中SparkConfClass类为自定义的一个Spark 类,主要将常用的SparkConf、SparkContext、SparkContext、以及关闭操作封装到一个类。

import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.SQLContext

class SparkConfClass() extends Serializable {
  @transient
  private val conf = new SparkConf().setAppName("pivot_demo").setMaster("local[4]")
    .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
  @transient
  private val sc: SparkContext = new SparkContext(conf)
  sc.setLogLevel("ERROR")
  @transient
  private val sqlContext: SQLContext = new SQLContext(sc)

  def getSc: SparkContext = {
    sc
  }

  def getSqlContext: SQLContext = {
    sqlContext
  }

  def closeSc(): Unit = {
    sc.stop()
  }
}

1.3 使用 Pivot 行转列

object PivotDemo {
  def main(args: Array[String]): Unit = {
    val store_salesFrame = DF_Data.scc.getSqlContext.createDataFrame(DF_Data.store_salesRDDRows, DF_Data.schemaStoreSales)
    store_salesFrame.show(20, false)

	//使用Spark中的函数,例如 round、sum 等
    import org.apache.spark.sql.functions._
    store_salesFrame.groupBy("category")
      .pivot("quarter")
      .agg(round(sum("sales"), 2))
      .show(false)
  }
}

1.4 初次处理的结果

我们的数据转成DataFrame后如下

+--------+-------+-----+
|category|quarter|sales|
+--------+-------+-----+
|   Books|     Q4| 4.66|
|   Books|     Q1| 1.58|
|   Books|     Q3| 2.84|
|   Books|     Q2|  1.5|
|   Women|     Q1| 1.41|
|   Women|     Q2| 1.36|
|   Women|     Q3| 2.54|
|   Women|     Q4| 4.16|
|   Music|     Q1|  1.5|
|   Music|     Q2| 1.44|
|   Music|     Q3| 2.66|
|   Music|     Q4| 4.36|
|Children|     Q1| 1.54|
|Children|     Q2| 1.46|
|Children|     Q3| 2.74|
|Children|     Q4| 4.51|
|  Sports|     Q1| 1.47|
|  Sports|     Q2|  1.4|
|  Sports|     Q3| 2.62|
|  Sports|     Q4|  4.3|
+--------+-------+-----+
only showing top 20 rows

按照类目,将每个季度转成列,如下,可以看到原始数据中category为null的行缺少第一和第三季度的值,但是经过pivot转换后,没有的列对应的值为null,这里需要注意,否则做统计时null值处理后可能还是null值。

+-----------+----+----+----+----+
|category   |Q1  |Q2  |Q3  |Q4  |
+-----------+----+----+----+----+
|Home       |1.57|1.51|2.79|4.6 |
|Sports     |1.47|1.4 |2.62|4.3 |
|Electronics|1.56|1.49|2.77|4.57|
|Books      |1.58|1.5 |2.84|4.66|
|Men        |1.6 |1.54|2.86|4.71|
|Music      |1.5 |1.44|2.66|4.36|
|Women      |1.41|1.36|2.54|4.16|
|Shoes      |1.51|1.48|2.68|4.46|
|Jewelry    |1.45|1.39|2.59|4.25|
|Children   |1.54|1.46|2.74|4.51|
|null       |null|0.04|null|0.13|
+-----------+----+----+----+----+

1.5 下一步

通过上一步已经将行数据转换为列数据,转换后的数据也是一个sql.DataFrame,那么我们就可将其注册为临时视图(这里叫 TempView ),如果是全局的,查询的时候记得在表名前加上global_temp。

注册成临时视图后,我们就可以像操作表数据一样用SQL操作这个数据了,例如现在需要返回,每个商品类目的每个季度的销售额、总销售额,精确到小数点两位。

	import org.apache.spark.sql.functions._
    store_salesFrame.groupBy("category")
       // 指定行转列的各个字段集合,如果知道具体的字段,最好指定上
      .pivot("quarter", Seq("Q1", "Q2", "Q3", "Q4"))
      // 对于同一category的数据,如果quarter值相同时就对其求和,并保留两位小数
      .agg(round(sum("sales"), 2))
        .createOrReplaceGlobalTempView("category")
//        .createTempView("category")

    DF_Data.scc.getSqlContext
      .sql(
        """
          |SELECT category, Q1, Q2, Q3, Q4, ROUND(NVL(Q1, 0.0) + NVL(Q2, 0.0) + NVL(Q3, 0.0) + NVL(Q4, 0.0), 2) AS total
          |FROM global_temp.category
        """.stripMargin)
      .show(false)

存在null值时我们需要调用NVL处理下,结果如下

+-----------+----+----+----+----+-----+
|category   |Q1  |Q2  |Q3  |Q4  |total|
+-----------+----+----+----+----+-----+
|Home       |1.57|1.51|2.79|4.6 |10.47|
|Sports     |1.47|1.4 |2.62|4.3 |9.79 |
|Electronics|1.56|1.49|2.77|4.57|10.39|
|Books      |1.58|1.5 |2.84|4.66|10.58|
|Men        |1.6 |1.54|2.86|4.71|10.71|
|Music      |1.5 |1.44|2.66|4.36|9.96 |
|Women      |1.41|1.36|2.54|4.16|9.47 |
|Shoes      |1.51|1.48|2.68|4.46|10.13|
|Jewelry    |1.45|1.39|2.59|4.25|9.68 |
|Children   |1.54|1.46|2.74|4.51|10.25|
|null       |null|0.04|null|0.13|0.17 |
+-----------+----+----+----+----+-----+



2 Spark 中数据转换与处理

在 Spark 程序中经常需要读取某个文件,对读取到的文件使用 RDD、DataSet、DataFrame、临时表等进行处理,下面以一个简单的流程演示 Spark 中的数据转换与处理。

2.1 测试数据

加入现在有如下数据 data_01.txt

|SECURITIES|ERROR CODE|NUM FLDS|CRNCY|BASE_CRNCY|PX_LAST|QUOTE_FACTOR|LAST_UPDATE_DT|LAST_UPDATE|
|H****D T170 Curncy|0|6|USD|HKD|.128740|1.0000|20181121|20:00:00|
|I****Y T170 Curncy|0|6|JPY|IDR|.748200|100.0000|20181121|20:00:00|
|A****P CMPN Curncy|0|6|MOP|AUD|6.195100|1.0000|20181121|20:00:00|
|J****D CMPN Curncy|0|6|YND|JPY|21195.620000|100.0000|20181121|20:00:00|
|V****R CMPN Curncy|0|6|IDR|VND|N.A.|1.0000|N.A.|N.A.|
|V****P CMPN Curncy|0|6| | | | | | |

2.2 清洗过滤

因为数据中开头和结尾都有分割符,先去除一下

val path = "spark-3.x/spark-df/src/main/resources/data_01.txt"
// 使用前面 1.2节定义好的 SparkConfClass 获取 getSqlContext
val spark = DF_Data.scc.getSqlContext
import spark.implicits._
// load 后为 DataFrame
val lines = spark.read/*.schema()*/.format("text").load(path)
    .map(line => line.get(0).toString.replaceAll("^\\|{1}|\\|{1}$", ""))

lines.show(10, false)

输出结果如下

+-----------------------------------------------------------------------------------------------+
|value                                                                                          |
+-----------------------------------------------------------------------------------------------+
|SECURITIES|ERROR CODE|NUM FLDS|CRNCY|BASE_CRNCY|PX_LAST|QUOTE_FACTOR|LAST_UPDATE_DT|LAST_UPDATE|
|H****D T170 Curncy|0|6|USD|HKD|.128740|1.0000|20181121|20:00:00                                |
|I****Y T170 Curncy|0|6|JPY|IDR|.748200|100.0000|20181121|20:00:00                              |
|A****P CMPN Curncy|0|6|MOP|AUD|6.195100|1.0000|20181121|20:00:00                               |
|J****D CMPN Curncy|0|6|YND|JPY|21195.620000|100.0000|20181121|20:00:00                         |
|V****R CMPN Curncy|0|6|IDR|VND|N.A.|1.0000|N.A.|N.A.                                           |
|V****P CMPN Curncy|0|6| | | | | |                                                              |
+-----------------------------------------------------------------------------------------------+

2.3 DataSet 转 RDD

// 过滤掉第一行
val rdd = lines.rdd.filter(line => !line.toString.contains("SECURITIES|"))
  .map(line => line.toString().split("\\|"))
  .map(line => Row(
    line(0), line(1),line(2),line(3),line(4),
    line(5),line(6),line(7),line(8)
  ))

rdd.collect().foreach(r => println(r))

输出结果如下

[H****D T170 Curncy,0,6,USD,HKD,.128740,1.0000,20181121,20:00:00]
[I****Y T170 Curncy,0,6,JPY,IDR,.748200,100.0000,20181121,20:00:00]
[A****P CMPN Curncy,0,6,MOP,AUD,6.195100,1.0000,20181121,20:00:00]
[J****D CMPN Curncy,0,6,YND,JPY,21195.620000,100.0000,20181121,20:00:00]
[V****R CMPN Curncy,0,6,IDR,VND,N.A.,1.0000,N.A.,N.A.]
[V****P CMPN Curncy,0,6, , , , , , ]

2.4 RDD 转 DataFrame

// Scame,这里先全部以 String 类型处理
val schema: StructType = StructType(
  lines.head().split("\\|")
    .map(filed => StructField(filed, StringType, true))
)

// 生成DF
val df = spark.createDataFrame(rdd, schema)
df.show(10, false)

输出结果如下

+------------------+----------+--------+-----+----------+------------+------------+--------------+-----------+
|SECURITIES        |ERROR CODE|NUM FLDS|CRNCY|BASE_CRNCY|PX_LAST     |QUOTE_FACTOR|LAST_UPDATE_DT|LAST_UPDATE|
+------------------+----------+--------+-----+----------+------------+------------+--------------+-----------+
|H****D T170 Curncy|0         |6       |USD  |HKD       |.128740     |1.0000      |20181121      |20:00:00   |
|I****Y T170 Curncy|0         |6       |JPY  |IDR       |.748200     |100.0000    |20181121      |20:00:00   |
|A****P CMPN Curncy|0         |6       |MOP  |AUD       |6.195100    |1.0000      |20181121      |20:00:00   |
|J****D CMPN Curncy|0         |6       |YND  |JPY       |21195.620000|100.0000    |20181121      |20:00:00   |
|V****R CMPN Curncy|0         |6       |IDR  |VND       |N.A.        |1.0000      |N.A.          |N.A.       |
|V****P CMPN Curncy|0         |6       |     |          |            |            |              |           |
+------------------+----------+--------+-----+----------+------------+------------+--------------+-----------+

2.5 DataFrame 注册为临时表

// 注册为临时表
val view = df.createOrReplaceTempView("rate")
spark.sql("SELECT * FROM rate")
  .show(false)

执行后,他通过 SQL 查询临时表的数据,输出结果如下

+------------------+----------+--------+-----+----------+------------+------------+--------------+-----------+
|SECURITIES        |ERROR CODE|NUM FLDS|CRNCY|BASE_CRNCY|PX_LAST     |QUOTE_FACTOR|LAST_UPDATE_DT|LAST_UPDATE|
+------------------+----------+--------+-----+----------+------------+------------+--------------+-----------+
|H****D T170 Curncy|0         |6       |USD  |HKD       |.128740     |1.0000      |20181121      |20:00:00   |
|I****Y T170 Curncy|0         |6       |JPY  |IDR       |.748200     |100.0000    |20181121      |20:00:00   |
|A****P CMPN Curncy|0         |6       |MOP  |AUD       |6.195100    |1.0000      |20181121      |20:00:00   |
|J****D CMPN Curncy|0         |6       |YND  |JPY       |21195.620000|100.0000    |20181121      |20:00:00   |
|V****R CMPN Curncy|0         |6       |IDR  |VND       |N.A.        |1.0000      |N.A.          |N.A.       |
|V****P CMPN Curncy|0         |6       |     |          |            |            |              |           |
+------------------+----------+--------+-----+----------+------------+------------+--------------+-----------+

2.6 完整代码

package yore

import org.apache.spark.sql.Row
import org.apache.spark.sql.types.{StringType, StructField, StructType}

object DF_Rate {
  def main(args: Array[String]): Unit = {
    val path = "spark-3.x/spark-df/src/main/resources/data_01.txt"
    val spark = DF_Data.scc.getSqlContext
    import spark.implicits._
    val lines = spark.read
      .format("text")
      .load(path)
      .map(line => line.get(0).toString.replaceAll("^\\|{1}|\\|{1}$", ""))

    val rdd = lines.rdd.filter(line => !line.toString.contains("SECURITIES|"))
      .map(line => line.toString().split("\\|"))
      .map(line => Row(
        line(0), line(1),line(2),line(3),line(4),
        line(5),line(6),line(7),line(8)
      ))

    // Scame,这里先全部以 String 类型处理
    val schema: StructType = StructType(
      lines.head().split("\\|")
        .map(filed => StructField(filed, StringType, true))
    )

    // 生成DF
    val df = spark.createDataFrame(rdd, schema)

    // 注册为临时表
    val view = df.createOrReplaceTempView("rate")
    spark.sql("SELECT * FROM rate")
      .show(false)
  }
}

【spark】行列互转的思考 本文基于一个具体的案例,介绍spark中case when,stack,lateral view explode,pivot的用法,并做一些性能上的比较 一、背景 群里有个小伙伴出了一道题目是行转列(多行数据转成多列数据) 如图,把上表的数据通过sql变成下表的数据 当然实现方法还是比较多的,我也想了几种方式,并随便搞了2.5亿条数据测试下性能(表格式是text,每个文件块大小都很均匀) 二、实现方法 不同引擎里,会有不同的函数或者语法做行列的转换,我这里就针对spark引擎. 阅读详情

相关推荐

Spark中使用DataFrame进行数据转换和操作

DataFrame是一种分布式数据集,它以表格形式组织数据,每一列都有名称和数据类型。DataFrame是强类型的,这意味着它可以在编译时捕获错误,提供更好的类型安全性。可以将DataFrame视为关系型数据库表或Excel表格,但它具有分布式计算的能力。Spark中的DataFrame是一个强大的工具,用于处理结构化数据,并提供了丰富的数据转换和操作功能。本文深入探讨了DataFrame的基本概念、数据加载、数据筛选、列选择、数据聚合、数据连接、窗口函数、数据保存以及性能优化和注意事项等方面的内容。

日常分享数据分析开发、编程语言内容 988

Spark实现行列转换pivot和unpivot

背景 做过数据清洗ETL工作的都知道,行列转换是一个常见的数据整理需求。在不同的编程语言中有不同的实现方法,比如SQL中使用case+group,或者Power BI的M语言中用拖放组件实现。今天正好需要在pyspark中处理一个数据行列转换,就把这个方法记录下来。 首先明确一下啥叫行列转换,因为这个叫法也不是很统一,有的地方叫转置,有的地方叫透视,不一而足。我们就以下图为例,定义如下: 从左边这种变成右边这种,叫透视(pivot) 反之叫逆透视(unpivot) Spark实...

onway_goahead的博客 1745

【spark】spark SQL概述 RDD、DataFrame及DataSet开发 相互转换 以及sparksql和mysql数据转换

文章目录一、sparksql概述二、sparksql四大特性三、DataFrame简介DataFrame与RDD的区别DataFrame与RDD的优缺点读取数据源创建DataFrame读取json文件创建DataFrame四、DataFrame常用操作DSL风格语法SQL风格语法六、DataSetDataFrame、DataSet、RDD的区别DataFrame与DataSet互相转换创建Data...

废物点心的博客 981

python处理表格dataframe-如何实现行转列和列转行?

在python中,我们可以使用pandas库来处理表格数据,而pandas库中的核心数据类型就是DataFrame。在处理DataFrame数据时,有时候需要将行转换为列,或者将列转换为行。下面是一个简单的例子,展示如何使用pandas库实现行转列和列转行。

xili1342的博客 6511

利用Spark将DataFrame、Hive数据写入Oracle

本篇博文的主要内容: 1、分析Spark读写Oracle方法 2、DataFrame数据写入Oracle 3、Hive数据写入Oracle DataFrame是在Spark1.3.0中推出的新的api,它借鉴了R语言DataFrame的一些优点,这让spark具备了处理大规模结构化数据的能力。作为Spark初学者,在通过学习使用Spark读写RDBMS数据的过程中,遇到了一系统的问

NASAXK的博客 8454

Spark SQL DataFrame 算子

DataFrame 算子与 SQL 查询语句之间,并没有优劣之分,他们可以实现同样的数据应用,而且在执行性能方面也是一致的。因此,你可以结合你的开发习惯与偏好,自由地在两者之间进行取舍。DataFrame 本身支持的算子之外,在功能上,SQL 完全可以实现同样的数据分析。给定 DataFrame,你只需通过 createTempView 或是 createGlobalTempView 来创建临时表,然后就可以通过写 SQL 语句去进行数据的探索、倾斜、转换与分析。

2401_84052244的博客 3590

Hive Sql列转行 行专列 及Spark Dataframe Api使用

文章目录1.列转行1.1 Hive Sql1.2 Dataframe Api使用2.行转列2.1 Hive SqlDataframe Api使用 1.列转行 1.1 Hive Sql 基础数据 单列转行(去重) select uid,concat_ws(',',collect_set(name))from test group by uid; 结果: 1001 张三 1002 李四 1003 ...

oiupoiupga1的博客 649

spark 读取hbase数据并转化为dataFrame

最近两天研究spark直接读取hbase数据,并将其转化为dataframe。之所以这么做, 1、公司的数据主要存储在hbase之中 2、使用dataframe,更容易实现计算。   尽管hbase的官方已经提供了hbase-spark 接口,但是并未对外发布,而且目前的项目又有这方面的需求,且网上关于这么方面的参考比较少,   故贴出来,代码如下,仅供参考        

robwang151的博客 2766

pyspark案例系列7-通过dataframe的pivot实现行转列

spark pivot 自动行转列

只是甲的博客 1042

pandas将dataframe中的指定数据行的内容转化为dataframe的列名称(convert certain row to column labels)

pandas将dataframe中的指定数据行的内容转化为dataframe的列名称(convert certain row to column labels)

data+scenario+science+insight 892

看不懂分子动力学模拟的结果?一文读懂RMSD曲线

随后,将每一帧结构与初始模板进行叠合,计算对应原子的平均偏移量,即RMSD。总之,掌握 RMSD 的解读方法,就等于抓住了评估分子动力学模拟成败与质量的“总开关”。①在模拟初始阶段,RMSD会从0迅速上升,这是蛋白质从静态晶体或模型结构释放到溶液环境中并逐渐适应的正常过程。②经过一段时间后,曲线不再系统性上升或下降,而是围绕一个平均值,小幅度地上下波动,形成一个稳定的“平台”。这种情况下,RMSD 在初始快速上升后,并未进入平台,而是持续甚至加速上升,始终未见收敛。🔍 如何解读不同趋势的RMSD曲线。

weixin_46587777的博客 4884

SparkSql行转列,groupBy算子用法

package bigdata import java.util import bean.Row2ColFieldBean import com.alibaba.fastjson.JSON import org.apache.spark.sql.{Column, DataFrame, SparkSession} import utils.SparkUtils import scala.collection.JavaConversions._ object Row2Column { def ch

weixin_48149210的博客 419

新版MQL语言程序设计:用vscode编写编译调试mt4和mt5程序

使用VScode搭建MT4与MT5开发环境,实现编辑编译调试统一。

超哥量化的博客 6871

spark dataframe笔记 -- dataframe行转列

把dataframe一行内容变成多行。 脚本: #!/usr/bin/python # -*- coding: utf-8 -*- """ @author: @contact: @time: """ from __future__ import print_function from pyspark.sql import SparkSession import os, time from pysp...

wo的博客 6247

Computer Networks 和 Computer & Security投稿经验

论文投稿

qq_50604294的博客 9225

Polardb训练营-本地部署 PolarDB-X

PolarDB-X是阿里巴巴自主设计研发的高性能云原生分布式数据库产品,为用户提供高吞吐、大存储、低延时、易扩展和超高可用的云时代数据库服务。云原生+MySQL生态PolarDB-X已作为标准云产品在世界范围内的13个地区提供服务。依托云资源和容器化部署能力,PolarDB-X可以在数分钟内完成集群创建和变配,整个过程中用...

yangjunfeng0604的博客 2472

spark 实现列转行

1、列转行行转列和列转行是我们常用的功能,假如我们有如下的csv文件:+---+----+---------+ |id |name|address | +---+----+---------+ |1 |a |add1,add2| |2 |b |add3 | |3 |c |add4 | |4 |d |add5 | +---+----+--------...

Islotus 5676

飞书云文档API操作详细介绍

开通云文档API、python程序调用飞书api、飞书获取app_id和app_secret、

Brother_ning的博客 1万+

spark Dataset<Row>的合并 将本地数据转换为spark的 Dataset<Row>类型

由于项目需要,要自己写一个数据转换接口。将Dataset<Row>传入本地算法进行处理,将经过本地算法处理后的行列数据转换为Dataset<Row>返回。 1、获取Dataset<Row>数据到本地 使用list获取数据: List<Row> list = dataset.collectAsList(); in...

代码搬运工 3308

嵌入式开发环境Vscode开发STM32单片机程序

STM32单片机非常强大,大多数教程都是使用 keil 编译器,keil 是收费的而 gcc 是开源免费的。这里介绍一些使用 gcc +开发单片机程序的经验。(这里不解释 gcc 是什么)。

嵌入式技术开发 1839

【LaTex】3.5 数据分析

简述了LaTex柱状图、饼图、折线图的画法。

你的指尖有改变世界的力量 5887

Spark DataFrame 相关函数汇总

DataFrame 的函数 Action 操作 1、collect() ,返回值是一个数组,返回dataframe集合所有的行 2、collectAsList() 返回值是一个java类型的数组,返回dataframe集合所有的行 3、count() 返回一个number类型的,返回dataframe集合的行数 4、describe(cols: String*) 返回一个通过数学计算的类表...

不管大小写的博客 2528

Python实现商品价格监控与波动分析爬虫项目

本文通过完整的代码示例和详细的技术讲解,展示了如何实现商品价格的自动监控和波动分析。该项目不仅适用于个人购物助手,还可以扩展为商家的竞品监控工具。通过结合数据抓取、存储、分析与可视化,能够帮助我们更好地理解市场趋势并做出优化决策。

2201_76125261的博客 1740

spark 数据转换为dataFrame的两种方式

1. 隐式转换toDF 1)使用case-class case class Person(name: String, age: Int) 引入隐式转换的包 import sqlContext.implicits._ 创建case-class的Rdd val rdd: RDD[Person] = sc.parallelize(Array( Person("fanghailiang", 29), Person("sunyu", 28), Person("jiaol

迎接小天使 5181

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Spark-SQL之DataFrame操作大全

本文中的代码基于Spark-1.6.2的文档实现。

weixin_43813200的博客 4191

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

spark sql保存DataFrame成json格式与读取json数据成DataFrame

在hdfs上存储一个sql文件 cust.txt: 1,smith,12 2,bob,13 3,alex,14 4,alice,15 6,mike,26 1.将DataFrame转换为json数据格式 import org.apache.spark import org.apache.spark.sql.SparkSession /** * 将数据框保存成json数据 ...

nengyu的专栏 6780

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

上一篇: Apache Kylin的安装和使用
下一篇: 工作流任务调度系统:Apache DolphinScheduler
Yore Yuen
博客等级 码龄9年 8646粉丝 58原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Yore Yuen

你的支持认可是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值