相关文章推荐

当表的分区有子目录时,spark sql默认是不支持的,可以用以下设置:

在hive cli里直接set mapreduce.input.fileinputformat.input.dir.recursive=true;就可以正常使用spark sql引擎
在代码层面可以尝试
.set("spark.hive.mapred.supports.subdirectories","true")
.set("spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive","true")
  使用Hive的insert overwrite/into select ... union all生成的Hive表数据时,会在原本的数据表目录下生成多个子目录(HIVE_UNION_SUBDIR_1、HIVE_UNION_SUBDIR_2),以存放数据文件(正常情况下数据文件会直接存放在数据表目录下)。
  这时,如果使用spark-sql去查询该数据表的时候,会报 Not a file 的异常:
Cause by: java.io.IOException: Not a file: hdf
                                    ​    目前做的是电商项目,有优惠券可以转赠的功能,在数据处理的时候发现需要将该券的源头找到,但是优惠券转赠是可以无限转赠的,库里存的数据是优惠券id以及被转赠的优惠券id数据示例如下。第一行是券id,第二行是券被转赠id,我们需要找到id为218–>1–>265–>9,9就是218的券来源,由于可以转赠无限手,所以需要递归查找。2–>288–>10,218–>1–>265–>9每个id都找到了自己的转赠源头。最后将datafream的数据插入到hive的数据表中就可以了。
1. 输入分片与块
输入分片:在mapreduce中为单个map才做来处理的输入块。一个map只处理一个分片数据。以下不说明时。分片即为输入分片。
块:HDFS中文件的存储形式。默认情况下,一个分片即为一个快。
2. MR中的分片表示
输入分片在Java中表示为InputSplit接口,包含两个方法。
public abst...
def getOnlineFirstDir: Array[String] = {
	// 获取路径
	val path = s"s3://transsion-athena${GlobalParameters.path_flag}/online/"
	val filePath = new org.apache.hadoop.fs.Path( path )
	// 获取文件系统
	val fileSystem = filePath..
set hive.mapred.supports.subdirectories=true;
set mapreduce.input.fileinputformat.input.dir.recursive=true;
                                    Spark一次性读取指定目录下的所有子目录(嵌套)下的所有文件(pyspark语言为例子)
sc = spark.sparkContext
rdd = sc.textFile("/file/*/part-*")
当前目录:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hdvK2g4M-1644562997368)(C:\Users\guokai02\AppData\Roaming\Typora\typora-user-images\image-2022021115
如果是在终端启动 spark shell,那么就执行
	spark-sql --conf spark.hadoop.mapreduce.input.fileinputformat.input.dir.recursive=true --conf spark.hive.mapred.supports.subdirectories=true
	如果是代码,那么就设置下边两个参数
  .set("spark.hadoop.m.
                                    问题解决: Spark无法读取有多个子目录的Parquet表
用tez做数据处理时,免不了要用union all来整合多个数据源的数据。但是如果最后一步是union all的话,就会生成多个子目录,这时用Spark就可能无法读取到子目录中的内容(取决于spark的配置)。
这个问题的原因是tez的union all是并行去做的,为了避免文件的冲突,tez写到了多个子目录里面。解决这个问题有两个方向...
                                      本文主要介绍spark读取hdfs文件,并利用spark-sql进行join操作,最后将结果写入hdfs文件系统,话不多说,直接上代码。
1,准备数据文件
math.txt
sports.txt
2,代码实现
package com.zero.scala.sparkCore
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.sql.{Da
import org.apache.spark.SparkContext
import org.apache.spark.sql.{DataFrame, Dataset, Row, SparkSession}
object JdbcDataSource {
  def main(args: Array[Stri
                                    最近项目要用准时数据,于是改用sparkSQL还对数据进行统计。kafka落到HDFS上是按照天分区,小时文件。
HDFS上的目录结构如下:
A/20190101/2019010100   A/20190101/2019010101
B/20190101/2019010100   B/20190101/2019010101
方法1:使用sparkContext.read.text(paths=[p...
 
推荐文章