当前位置: 首页 > 面试题库 >

更改DataFrame.write()的输出文件名前缀

梁锋
2023-03-14
问题内容

通过Spark SQL DataFrame.write()方法生成的输出文件以“ part”基本名称前缀开头。例如

DataFrame sample_07 = hiveContext.table("sample_07");
sample_07.write().parquet("sample_07_parquet");

结果是:

hdfs dfs -ls sample_07_parquet/                                                                                                                                                             
Found 4 items
-rw-r--r--   1 rob rob          0 2016-03-19 16:40 sample_07_parquet/_SUCCESS
-rw-r--r--   1 rob rob        491 2016-03-19 16:40 sample_07_parquet/_common_metadata
-rw-r--r--   1 rob rob       1025 2016-03-19 16:40 sample_07_parquet/_metadata
-rw-r--r--   1 rob rob      17194 2016-03-19 16:40 sample_07_parquet/part-r-00000-cefb2ac6-9f44-4ce4-93d9-8e7de3f2cb92.gz.parquet

我想更改使用Spark SQL DataFrame.write()创建文件时使用的输出文件名前缀。我尝试在Spark上下文的hadoop配置上设置“
mapreduce.output.basename”属性。例如

public class MyJavaSparkSQL {

  public static void main(String[] args) throws Exception {
    SparkConf sparkConf = new SparkConf().setAppName("MyJavaSparkSQL");
    JavaSparkContext ctx = new JavaSparkContext(sparkConf);
    ctx.hadoopConfiguration().set("mapreduce.output.basename", "myprefix");
    HiveContext hiveContext = new org.apache.spark.sql.hive.HiveContext(ctx.sc());
    DataFrame sample_07 = hiveContext.table("sample_07");
    sample_07.write().parquet("sample_07_parquet");
    ctx.stop();
  }

这不会更改生成文件的输出文件名前缀。

使用DataFrame.write()方法时,是否有方法可以覆盖输出文件名前缀?


问题答案:

使用任何标准输出格式(例如Parquet)时,都不能更改“ part”前缀。请参阅ParquetRelation
代码中的以下片段:

private val recordWriter: RecordWriter[Void, InternalRow] = {
  val outputFormat = {
    new ParquetOutputFormat[InternalRow]() {
      // ...
      override def getDefaultWorkFile(context: TaskAttemptContext, extension: String): Path = {
        // ..
        //  prefix is hard-coded here:
        new Path(path, f"part-r-$split%05d-$uniqueWriteJobId$bucketString$extension")
    }
  }
}

如果确实必须控制零件文件名,则可能必须实现自定义FileOutputFormat并使用Spark的其中一个接受FileOutputFormat类的保存方法(例如saveAsHadoopFile)。



 类似资料:
  • 我正在尝试编写HTML输出文件。文件已经编写好,一切都很好,但我想知道是否有方法将字符串与文件名结合起来,检查是否存在,如果存在,然后以某种方式更改该字符串。所以我永远不会覆盖已经存在的文件。 所以在这种情况下,如果outputFile是,让我们说“Jesus”,那么我想做一些事情,如果我运行这个3次,我会得到类似Jesus的东西。html,Jesus2。html,Jesus3。html。不必像那

  • 目前,我能够在mapper中实现从到自定义文件名的名称更改。我通过使用来实现这一点。我在reducer中尝试了同样的方法来重命名文件,但fileSplit方法不适用于reducer。那么,有没有最好的方法将reducer的输出重命名为inputfile name呢。下面是我如何在mapper中实现的。

  • 问题内容: 我想更改特定文件夹中文件的扩展名。我在论坛上阅读了有关此主题的信息。使用“确实”的想法,我编写了以下代码,我希望它可以工作,但不能。我很感谢您为我的失误提供任何指导。 问题答案: 在对源文件是不必要的,因为只需要在源和目标路径来完成这项工作。而且,始终返回,因此调用其返回值没有任何意义。 我简单地删除了两个。检查是否适合您。

  • 我可以把google-services.json文件名改成prod-google-services.json?

  • 我对集成和IBM集成总线工具包的世界非常陌生。我正在使用IBM Integration Bus Toolkit进行一个小练习,通过这个练习,我的小应用程序可以获取一个。txt文件并将其移动到另一个目录中(我正在使用消息流)。我甚至可以指定输出文件的文件名 我现在想做的是通过添加当前日期来附加输出文件的文件名(例如output-20180225.txt),但我不太确定如何以及在哪里执行。 我知道有一

  • 阅读器bean 我尝试这样做:在FlatFileItemReader的实现中,将输入文件路径作为string属性添加到ExecutionContext的映射中。在我的FlatFileItemWriter实现中-重写setResource,并实际从ExecutionContext的值中创建一个Resource对象。这样行吗?