Spark-02

Spark
--------------------
    通用性。


Spark模块
-------------
    Spark Core            //核心库
    Spark SQL            //SQL
    Spark Streaming        //准实时计算。
    Spark MLlib            //机器学习库
    Spark graph            //图计算

Spark集群运行
--------------------
    1.local            //本地模式
    2.standalone    //独立模式
    3.yarn            //yarn模式
    4.mesos            //mesos

start-all.sh
------------------
    start-master.sh    //RPC端口 7077
    start-slave.sh    spark://s201:7077

webui
------------------
    http://s201:8080


添加针对scala文件的编译插件
------------------------------
    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>

        <groupId>com.it18zhang</groupId>
        <artifactId>SparkDemo1</artifactId>
        <version>1.0-SNAPSHOT</version>

        <build>
            <sourceDirectory>src/main/java</sourceDirectory>
            <plugins>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
                <plugin>
                    <groupId>net.alchim31.maven</groupId>
                    <artifactId>scala-maven-plugin</artifactId>
                    <version>3.2.2</version>
                    <configuration>
                        <recompileMode>incremental</recompileMode>
                    </configuration>
                    <executions>
                        <execution>
                            <goals>
                                <goal>compile</goal>
                                <goal>testCompile</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>

        <dependencies>
            <dependency>
                <groupId>org.apache.spark</groupId>
                <artifactId>spark-core_2.11</artifactId>
                <version>2.1.0</version>
            </dependency>
        </dependencies>
    </project>


C:\Users\Administrator\.m2\repository\net
C:\Users\Administrator\.m2\repository\net\alchim31\maven\...

SparkContext:
------------------
    Spark集群的连接。主要入口点。
    SparkConf = new ();
    conf.setApp("")
    conf.setMaster("local") ;
    sc = new SparkContext(conf);
    //RDD : Resilient distributed dataset,弹性分布式数据集。
    val rdd1 = sc.textFile("d:/scala/test.txt");
    val rdd2 = rdd1.flatMap(line=>line.split(" "));
    val rdd3 = rdd2.map(word=>(word,1));
    val rdd4 = rdd3.reduceByKey(_ + _) ;
    val list = rdd4.collect()
    list.foreach(e=>println(e));


    //
    sc.textFile("d:/scala").flatMap(_.split(" ")).map((_1)).reduceByKey(_ + _).collect().foreach(println)


spark
-------------
    基于hadoop的mr,扩展MR模型高效使用MR模型,内存型集群计算,提高app处理速度。

spark特点
-------------
    速度:在内存中存储中间结果。
    支持多种语言.
    内置了80+的算子.
    高级分析:MR,SQL/ Streamming /mllib / graph

spark模块
    core        //通用执行引擎,提供内存计算和对外部数据集的引用。
    SQL            //构建在core之上,引入新的抽象SchemaRDD,提供了结构化和半结构化支持。

    Streaming    //小批量计算,RDD.

    MLlib        //机器学习库。core在。
    Graphx        //图计算。


RDD:
----------------
    是spark的基本数据结构,是不可变数据集。RDD中的数据集进行逻辑分区,每个分区可以单独在集群节点
    进行计算。可以包含任何java,scala,python和自定义类型。

    RDD是只读的记录分区集合。RDD具有容错机制。

    创建RDD方式,一、并行化一个现有集合。

    hadoop 花费90%时间用户rw。、
    
    内存处理计算。在job间进行数据共享。内存的IO速率高于网络和disk的10 ~ 100之间。

    内部包含5个主要属性
    -----------------------
    1.分区列表
    2.针对每个split的计算函数。
    3.对其他rdd的依赖列表
    4.可选,如果是KeyValueRDD的话,可以带分区类。
    5.可选,首选块位置列表(hdfs block location);

//默认并发度
local.backend.defaultParallelism() = scheduler.conf.getInt("spark.default.parallelism", totalCores)
taskScheduler.defaultParallelism = backend.defaultParallelism()
sc.defaultParallelism =...; taskScheduler.defaultParallelism
defaultMinPartitions = math.min(defaultParallelism, 2)
sc.textFile(path,defaultMinPartitions)            //1,2


RDD变换
------------------
    返回指向新rdd的指针,在rdd之间创建依赖关系。每个rdd都有计算函数和指向父RDD的指针。
    
    map()                                    //对每个元素进行变换,应用变换函数
                                            //(T)=>V


    filter()                                //过滤器,(T)=>Boolean
    flatMap()                                //压扁,T => TraversableOnce[U]

    mapPartitions()                            //对每个分区进行应用变换,输入的Iterator,返回新的迭代器,可以对分区进行函数处理。
                                            //Iterator<T> => Iterator<U>

    mapPartitionsWithIndex(func)            //同上,(Int, Iterator<T>) => Iterator<U>

    sample(withReplacement, fraction, seed)    //采样返回采样的RDD子集。
                                            //withReplacement 元素是否可以多次采样.
                                            //fraction : 期望采样数量.[0,1]

    union()                                    //类似于mysql union操作。
                                            //select * from persons where id < 10 
                                            //union select * from id persons where id > 29 ;

    intersection                            //交集,提取两个rdd中都含有的元素。
    distinct([numTasks]))                    //去重,去除重复的元素。

    groupByKey()                            //(K,V) => (K,Iterable<V>)

    reduceByKey(*)                            //按key聚合。 

    aggregateByKey(zeroValue)(seqOp, combOp, [numTasks])
                                            //按照key进行聚合
    key:String U:Int = 0

    sortByKey                                //排序

    join(otherDataset, [numTasks])            //连接,(K,V).join(K,W) =>(K,(V,W)) 

    cogroup                                    //协分组
                                            //(K,V).cogroup(K,W) =>(K,(Iterable<V>,Iterable<!-- <W> -->)) 
    cartesian(otherDataset)                    //笛卡尔积,RR[T] RDD[U] => RDD[(T,U)]

    pipe                                    //将rdd的元素传递给脚本或者命令,执行结果返回形成新的RDD
    coalesce(numPartitions)                    //减少分区
    repartition                                //可增可减
    repartitionAndSortWithinPartitions(partitioner)
                                            //再分区并在分区内进行排序


RDD Action
------------------
    collect()                                //收集rdd元素形成数组.
    count()                                    //统计rdd元素的个数
    reduce()                                //聚合,返回一个值。
    first                                    //取出第一个元素take(1)
    take                                    //
    takeSample (withReplacement,num, [seed])
    takeOrdered(n, [ordering])
    
    saveAsTextFile(path)                    //保存到文件
    saveAsSequenceFile(path)                //保存成序列文件

    saveAsObjectFile(path) (Java and Scala)

    countByKey()                            //按照key,统计每个key下value的个数.
    

spark集成hadoop ha
-------------------------
    1.复制core-site.xml + hdfs-site.xml到spark/conf目录下
    2.分发文件到spark所有work节点
    3.启动spark集群
    4.启动spark-shell,连接spark集群上
        $>spark-shell --master spark://s201:7077
        $scala>sc.textFile("hdfs://mycluster/user/centos/test.txt").collect();    
 

<think>好的,我现在需要帮助用户了解如何使用Spark SQL批量删除表分区。首先,我需要回忆一下Spark SQL中处理分区的相关命令和操作步骤。用户提到的是“批量删除”,所以重点在于如何一次删除多个分区,而不是逐个删除。 首先,用户可能知道单个分区的删除方法,比如使用ALTER TABLE ... DROP PARTITION,但需要扩展到多个分区的情况。这时候,我需要确认Spark SQL是否支持在一条语句中指定多个分区条件,或者是否需要其他方法来实现批量操作。 接下来,我应该考虑Hive的语法,因为Spark SQL通常兼容Hive的DDL语句。Hive中是否允许在DROP PARTITION时使用多个条件?例如,用OR连接不同的分区值。或者是否可以使用正则表达式或类似IN的语法来选择多个分区? 然后,可能需要考虑动态SQL生成的方式,特别是当分区数量较多时,手动编写每个分区条件会很麻烦。这时候,可能需要通过编程方式生成多个ALTER TABLE语句,或者使用Spark的API来操作。 另外,用户可能使用的是外部表还是托管表?删除分区时是否要同时删除数据?这涉及到PURGE选项的使用,需要提醒用户注意数据是否会被删除。 还需要注意分区字段的数据类型,比如分区值如果是字符串,需要加引号,而数字则不需要,避免语法错误。 可能还需要给出具体的示例,让用户更清楚地理解如何编写语句。例如,使用多个PARTITION子句,或者用括号包含多个分区键值对,用逗号分隔。 此外,可能需要提到在Spark Thrift Server或通过spark-sql脚本执行这些命令的方法,以及如何处理大量分区时的效率问题,比如分批次处理或者并行执行。 最后,确保用户了解操作的风险,比如删除分区可能导致数据丢失,建议先备份或确认分区信息无误后再执行删除操作。</think>在Spark SQL中批量删除表分区,可以通过以下步骤实现: --- ### **方法1:使用Hive兼容语法** Spark SQL兼容Hive的DDL语法,可通过`ALTER TABLE ... DROP PARTITION`结合`OR`条件批量删除: ```sql ALTER TABLE db_name.table_name DROP IF EXISTS PARTITION (partition_col1 = 'value1', partition_col2 = 'value2'), PARTITION (partition_col1 = 'value3', partition_col2 = 'value4'), ...; ``` #### 示例: 删除2023年10月1日和2日的日志分区: ```sql ALTER TABLE logs.user_activity DROP IF EXISTS PARTITION (dt='2023-10-01'), PARTITION (dt='2023-10-02'); ``` --- ### **方法2:动态生成删除语句** 当分区数量较多时,可通过编程方式生成SQL语句(如使用Spark API或Shell脚本): #### 步骤: 1. **查询目标分区**: ```sql SHOW PARTITIONS db_name.table_name; ``` 2. **筛选需删除的分区**(例如删除2023年9月前的所有分区): ```sql SELECT partition_spec FROM db_name.table_name$partitions WHERE partition_col < '2023-09'; ``` 3. **生成批量删除语句**: ```python # 示例PySpark代码 partitions = spark.sql("SHOW PARTITIONS db_name.table_name").collect() for row in partitions: part_spec = row.partition.replace("/", ", ") # 转换格式 spark.sql(f"ALTER TABLE db_name.table_name DROP PARTITION ({part_spec}) PURGE") ``` --- ### **关键注意事项** 1. **数据删除风险**: - 默认行为会删除分区目录和数据(与Hive一致) - 外部表需谨慎操作,避免误删底层文件 2. **语法验证**: - 分区值为字符串需加引号:`dt='2023-10-01'` - 数值型无需引号:`id=123` 3. **性能优化**: - 大批量删除时建议分批次提交(如每次100个分区) - 启用并行执行:`SET spark.sql.sources.parallelPartitionDiscovery.parallelism=100;` --- ### **补充说明** - **PURGE选项**:立即删除数据(不进入Trash) ```sql ALTER TABLE table_name DROP PARTITION (...) PURGE; ``` - **元数据一致性**:删除分区后建议执行`MSCK REPAIR TABLE`修复元数据 建议先通过`SHOW PARTITIONS`验证目标分区列表,再执行删除操作以确保准确性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值