rdd

Convert StringType to ArrayType in PySpark

|▌冷眼眸甩不掉的悲伤 提交于 2020-01-21 15:27:04
问题 I am trying to Run the FPGrowth algorithm in PySpark on my Dataset. from pyspark.ml.fpm import FPGrowth fpGrowth = FPGrowth(itemsCol="name", minSupport=0.5,minConfidence=0.6) model = fpGrowth.fit(df) I am getting the following error: An error occurred while calling o2139.fit. : java.lang.IllegalArgumentException: requirement failed: The input column must be ArrayType, but got StringType. at scala.Predef$.require(Predef.scala:224) My Dataframe df is in the form: df.show(2) +---+---------+-----

Spark数据倾斜及解决办法

牧云@^-^@ 提交于 2020-01-21 12:07:14
数据倾斜 在执行shuffle操作过程中,map端按照key分配数据输出,reduce端同样也按照key进行拉取、聚合。通常每一个key对应的数据量不对等,经常出些某些key数据量比其他key多很多。这种现象导致的后果,轻则拖慢job执行时间(执行时间由最慢的task决定),重则直接OOM(数据量太大,处理完成前不能回收内存) 原因 我觉得是两个必要条件,缺一个都不发生数据倾斜,而我们打破其中一个或全部打破来解决数据倾斜。 每个key对应的数据量天然不均 发生shuffle操作 那么怎么定位代码中哪里出现了数据倾斜? 凭经验猜测会发生shuffle的算子 运行慢时。若是client模式,查看本地日志,当前还在运行的Stage、Task是哪个;若是cluster模式,查看UI,主要确定Stage中Task的数据量 报OOM时查看log抛错堆栈,可以定位到某一行代码,从而知道哪一个stage,哪个一个算子。 解决办法 数据源预处理 业务中,hive文件或其他数据源文件大小不均,有大有小。小文件处理很快,而大文件处理慢。如果提前对数据源数据进行一定的清洗、过滤、去重、重分区等操作,将原来不均匀的数据重新均匀放在多个文件中。 同理,针对key分布不均的情况,可以考虑将Spark 运算中业务时效不敏感的shuffle操作提前放到ETL进行预处理(比如预聚合、逻辑压缩等

Count on Spark Dataframe is extremely slow

落花浮王杯 提交于 2020-01-21 03:26:32
问题 I'm creating a new DataFrame with a handful of records from a Join. val joined_df = first_df.join(second_df, first_df.col("key") === second_df.col("key") && second_df.col("key").isNull, "left_outer") joined_df.repartition(1) joined_df.cache() joined_df.count() Everything is fast (under one second) except the count operation. The RDD conversion kicks in and literally takes hours to complete. Is there any way to speed things up? INFO MemoryStore: Block rdd_63_140 stored as values in memory

Spark-SQL 面试准备 2

馋奶兔 提交于 2020-01-21 01:51:30
Spark Knowledge NO.2 11.RDD缓存: Spark可以使用 persist 和 cache 方法将任意 RDD 缓存到内存、磁盘文件系统中。缓存是容错的,如果一个 RDD 分片丢失,可以通过构建它的 transformation自动重构。被缓存的 RDD 被使用的时,存取速度会被大大加速。一般的executor内存60%做 cache, 剩下的40%做task。 Spark中,RDD类可以使用cache() 和 persist() 方法来缓存。cache()是persist()的特例,将该RDD缓存到内存中。而persist可以指定一个StorageLevel。StorageLevel的列表可以在StorageLevel 伴生单例对象中找到。 Spark的不同StorageLevel ,目的满足内存使用和CPU效率权衡上的不同需求。我们建议通过以下的步骤来进行选择: 如果你的RDDs可以很好的与默认的存储级别(MEMORY_ONLY)契合,就不需要做任何修改了。这已经是CPU使用效率最高的选项,它使得RDDs的操作尽可能的快。 如果不行,试着使用MEMORY_ONLY_SER并且选择一个快速序列化的库使得对象在有比较高的空间使用率的情况下,依然可以较快被访问。 尽可能不要存储到硬盘上,除非计算数据集的函数,计算量特别大,或者它们过滤了大量的数据。否则

Spark第一个程序开发----WordCount

百般思念 提交于 2020-01-20 10:19:56
Spark第一个程序开发WordCount Java版本 package cn.spark.java.core; import java.util.Arrays; import java.util.Iterator; import org.apache.spark.SparkConf; import org.apache.spark.api.java.JavaPairRDD; import org.apache.spark.api.java.JavaRDD; import org.apache.spark.api.java.JavaSparkContext; import org.apache.spark.api.java.function.FlatMapFunction; import org.apache.spark.api.java.function.Function2; import org.apache.spark.api.java.function.PairFunction; import org.apache.spark.api.java.function.VoidFunction; import scala.Tuple2; /** * zgf * java本地测试WordCount程序 */ public class WordCountJavaLocal {

28_spark六—sql

陌路散爱 提交于 2020-01-20 08:08:11
spark内存计算框架 1、sparksql是什么 2、sparksql的四大特性 3、DataFrame概念 4、DataFrame与RDD对比(★★★) 引入schema元信息 引入off-heap使用堆外内存 5、DataFrame操作(★★★★★) DSL风格语法 SQL风格语法 6、DataSet概念 7、通过idea开发sparksql程序实现将RDD转换成DataFrame(★★★★★) 利用反射机制 通过StructType对象指定dataFrame表的schema信息 1.sparksql概述 1.1 sparksql的前世今生 Shark是专门针对于spark的构建大规模数据仓库系统的一个框架 Shark与Hive兼容、同时也依赖于Spark版本 Hivesql底层把sql解析成了mapreduce程序,Shark是把sql语句解析成了Spark任务 随着性能优化的上限,以及集成SQL的一些复杂的分析功能,发现Hive的MapReduce思想限制了Shark的发展。 最后Databricks公司终止对Shark的开发 决定单独开发一个框架,不在依赖hive,把重点转移到了 sparksql 这个框架上。 1.2 什么是sparksql Spark SQL is Apache Spark’s module for working with structured

RDD常用的算子操作

你说的曾经没有我的故事 提交于 2020-01-20 05:59:54
transformation算子 转换 含义 map(func) 返回一个新的RDD,该RDD由每一个输入元素经过func函数转换后组成 filter(func) 返回一个新的RDD,该RDD由经过func函数计算后返回值为true的输入元素组成 flatMap(func) 类似于map,但是每一个输入元素可以被映射为0或多个输出元素(所以func应该返回一个序列,而不是单一元素) mapPartitions(func) 类似于map,但独立地在RDD的每一个分片上运行,因此在类型为T的RDD上运行时,func的函数类型必须是Iterator[T] => Iterator[U] mapPartitionsWithIndex(func) 类似于mapPartitions,但func带有一个整数参数表示分片的索引值,因此在类型为T的RDD上运行时,func的函数类型必须是(Int, Interator[T]) => Iterator[U] union(otherDataset) 对源RDD和参数RDD求并集后返回一个新的RDD intersection(otherDataset) 对源RDD和参数RDD求交集后返回一个新的RDD distinct([numTasks])) 对源RDD进行去重后返回一个新的RDD groupByKey([numTasks]) 在一个(K,V

Apache Spark之DStream算子(章节五)

和自甴很熟 提交于 2020-01-19 16:51:12
DStreams 转换算子 与RDD类似,转换允许修改来自输入DStream的数据。 DStreams支持普通Spark RDD上可用的许多转换。一些常见的如下。 Transformation Meaning map ( func ) Return a new DStream by passing each element of the source DStream through a function func . flatMap ( func ) Similar to map, but each input item can be mapped to 0 or more output items. filter ( func ) Return a new DStream by selecting only the records of the source DStream on which func returns true. repartition ( numPartitions ) Changes the level of parallelism in this DStream by creating more or fewer partitions. union ( otherStream ) Return a new DStream that contains the

Spark 初入门

◇◆丶佛笑我妖孽 提交于 2020-01-19 00:31:30
1 简介 Spark是三大分布式计算系统开源项目之一(Hadoop,Spark,Storm)。 特点 运行速度快: Spark使用先进的DAG(Directed Acyclic Graph,有向无环图)执行引擎,以支持循环数据流与内存计算,基于内存的执行速度可比Hadoop MapReduce快上百倍,基于磁盘的执行速度也能快十倍; 容易使用: Spark支持使用Scala、Java、Python和R语言进行编程,简洁的API设计有助于用户轻松构建并行程序,并且可以通过Spark Shell进行交互式编程; 通用性: Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件,这些组件可以无缝整合在同一个应用中,足以应对复杂的计算; 运行模式多样: Spark可运行于独立的集群模式中,或者运行于Hadoop中,也可运行于Amazon EC2等云环境中,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源。 与Hadoop相比,Spark最大的特点就是将计算数据、中间结果都存储在内存中,大大减少了IO开销,因而,Spark更适合于迭代运算比较多的数据挖掘与机器学习运算。 2.安装 Spark可以独立安装使用,也可以和Hadoop一起安装使用。和Hadoop一起安装使用,可以让Spark使用HDFS存取数据。 当安装好Spark以后

Spark RDD持久化

北城以北 提交于 2020-01-19 00:14:08
当持久化一个RDD的时候,每一个节点都将参与计算的所有分区数据存储到内存中,并且这些数据可以被这个集合(以及这个集合衍生的其他集合)的动作(action)重复利用。这个能力使后续的动作速度更快(通常快10倍以上)。对应迭代算法和快速的交互使用来说,缓存是一个关键的工具。 持久化一个rdd方法 persist() cache() 每一个被持久化的RDD,可以利用不同的存储级别存储。 Storage Level Meaning MEMORY_ONLY 将RDD作为非序列化的Java对象存储在jvm中。如果RDD不适合存在内存中,一些分区将不会被缓存,从而在每次需要这些分区时都需重新计算它们。这是系统默认的存储级别。 MEMORY_AND_DISK 将RDD作为非序列化的Java对象存储在jvm中。如果RDD不适合存在内存中,将这些不适合存在内存中的分区存储在磁盘中,每次需要时读出它们。 MEMORY_ONLY_SER 将RDD作为序列化的Java对象存储(每个分区一个byte数组)。这种方式比非序列化方式更节省空间,特别是用到快速的序列化工具时,但是会更耗费cpu资源—密集的读操作。 MEMORY_AND_DISK_SER 和MEMORY_ONLY_SER类似,但不是在每次需要时重复计算这些不适合存储到内存中的分区,而是将这些分区存储到磁盘中。 DISK_ONLY