【问题标题】:inserting Data from list in a hive table using spark sql使用 spark sql 从列表中插入数据到配置单元表中
【发布时间】:2020-07-26 19:29:02
【问题描述】:

我有一个文件名、文件路径和文件大小的列表,我想使用 spark SQL 将这些详细信息插入到我的配置单元表中。

var fs1 = FileSystem.get(sparksession.sparkContext.hadoopConfiguration)
var file_path = fs1.listStatus(new  Path("path")).filter(_.isFile).map(_.getPath).toList
var new_files = fs1.listStatus(new  Path("path")).filter(_.isFile).map(_.getPath.getName).toList
var file_size = fs1.listStatus(new Path("path")).filter(_.isFile).map(_.getLen).toList
var file_data = file_path zip new_files zip file_size

for ((filedetail, size) <- file_size){
  var filepath = filedetail._1
  var filesize: Long = size
  var filename = filedetail._2
  var df = spark.sql(s"insert into mytable(file_path,filename,file_size)  select '${file_path}' as file_path,'${new_files}' as filename,'${file_size}' as file_size")
  df.write.insertInto("dbname.tablename")
}

它正在生成这个插入查询:

insert into mytable(file_path,filename,file_size) select  'List(path/filename.txt,path/filename4.txt,path/filename5.txt)' as file_path,'List(filename.txt, filename4.txt, filename5.txt)' as filename,'List(19, 19, 19)' as file_size;

我收到一个错误:

不匹配的输入 'file_path' 期望 {'(', 'SELECT', 'FROM', 'VALUES', 'TABLE', 'INSERT', 'MAP', 'REDUCE'}(第 1 行,第 34 行)

我想插入表格格式的数据

file_path                 filename      file_size
path/filename.txt         filename.txt  19
path/filename4.txt        filename4.txt  19
path/filename5.txt        filename5.txt  19

有人可以建议我如何插入上面的数据吗?

有没有办法再次将此查询拆分为 3 个不同的插入配置单元语句。

    insert into mytable(file_path,filename,file_size) select 'path/filename.txt' as file_path,'filename.txt' as filename,'19' as file_size;
    insert into mytable(file_path,filename,file_size) select 'path/filename3.txt' as file_path,'filename3.txt' as filename,'19' as file_size;
    insert into mytable(file_path,filename,file_size) select 'path/filename4.txt' as file_path,'filename4.txt' as filename,'19' as file_size;

【问题讨论】:

    标签: scala apache-spark hive apache-spark-sql


    【解决方案1】:

    您可以简单地创建一个包含所有行的列表,并且每行将包含 3 个元素。创建一个数据框,然后使用数据框持久化数据。

    refer this post

    【讨论】:

    • @H Roy 我已经检查了这篇文章,因为它对我的情况没有帮助。首先我从目录中获取所有文件名和大小,所以它每次都可以变化。即5,6....n 个文件。我需要在我的配置单元表中插入所有这些详细信息。
    【解决方案2】:

    您可以通过多种方式做到这一点。

    首先,您可以将列表转换为RDD

    val rdd1 = sc.parallelize(fs1.listStatus(new  Path("path")).filter(_.isFile).map(_.getPath).toList)
    
    // then you can convert the rdd into a dataframe
    
    import spark.implicits._
    
    val df1 = rdd1.map((value1, value2, ....) => (value1, value2,....)).toDF("col1", "col2", ....)
    
    // from the dataframe you can create a temporary view
    
    df1.createOrReplaceTempView("my_table")
    
    // then you can load the temporary view in your table
    
    sqlContext.sql("""
            INSERT [INTO | OVERWRITE] my_hive_table SELECT * FROM my_table
               """)
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 2017-07-02
      • 2019-12-21
      • 1970-01-01
      相关资源
      最近更新 更多