Apache spark 来自红移tempDir转储的Spark DataFrameReader
有没有办法从红移的tempDir转储创建数据帧 我的用例是,当一个作业失败时,我想重试,但继续从转储到S3的临时数据转储,而不是从庞大的红移重新获取数据集 加载代码会执行此操作Apache spark 来自红移tempDir转储的Spark DataFrameReader,apache-spark,apache-spark-sql,amazon-redshift,databricks,Apache Spark,Apache Spark Sql,Amazon Redshift,Databricks,有没有办法从红移的tempDir转储创建数据帧 我的用例是,当一个作业失败时,我想重试,但继续从转储到S3的临时数据转储,而不是从庞大的红移重新获取数据集 加载代码会执行此操作 val df1 = spark.read .format("com.databricks.spark.redshift") .option("url", jdbcUrl) .option("dbtable", spmeTable) .option("tempdir", tempDir) .option
val df1 = spark.read
.format("com.databricks.spark.redshift")
.option("url", jdbcUrl)
.option("dbtable", spmeTable)
.option("tempdir", tempDir)
.option("user", jdbcUsername)
.option("password", jdbcPassword)
.option("forward_spark_s3_credentials", true)
.load();
稍后作业失败,但我想重新创建df1,而不从RedShift再次获取任何内容
有办法做到这一点吗
在SparkSession下找到名为createDataFrame
的方法,不确定这是否是可能的解决方案。。。
更新#1
temp dir看起来像这里的目录结构
我从S3打开了一个临时文件,它是管道分隔的
edd66540-fa17-599b-9b22-7df29a5f9229|kNOCugU4wuKAUw7m2UXS7MfX|2018-11-27 19:48:44|POST|f|@NULL@|@NULL@|@NULL@|@NULL@|https://www.example.com/r/conversations/0grt6540-
更新#2
据此,
将文件写入S3后,将使用自定义InputFormat(com.databricks.spark.redshift.RedshiftInputFormat)并行使用这些文件。该类类似于Hadoop的标准TextInputFormat类,其中键是文件中每行开头的字节偏移量。然而,value类的类型是Array[String](与TextInputFormat不同,TextInputFormat的类型是Text)。通过使用默认分隔符(|)拆分行来创建值。RedshiftInputFormat逐行处理S3文件以生成RDD。然后在此RDD上应用前面获得的模式,将字符串转换为适当的数据类型并生成数据帧
除了跳过卸载,你知道怎么做吗?连接器默认情况下以avro格式转储数据() 还要注意,连接器不会自动清理临时位置() 我们可以通过指向
tempdir
val df = spark.read.format("avro").load(tempdir)
我尝试了这个,得到了
java.io.FileNotFoundException:没有找到Avro文件。如果文件没有.avro扩展名,请将ignoreExtension设置为true
,我打开了一个临时文件,它看起来像一个以管道分隔的文件format@AssafMoldavsky这最终对你有用吗?