【问题标题】:export many files from a table从表中导出多个文件
【发布时间】:2021-03-12 23:07:32
【问题描述】:

我有一个生成以下格式的表的 sql 查询

|sex  |country|popularity|
|null |null   | x        | 
|null |value  | x        |
|value|null   | x        |
|value|null   | x        |
|null |value  | x        |
|value|value  | x        |

性别列的值可以是女人,男人
国家的价值可以是意大利、英国、美国等。

x 是一个整数

现在我想根据数据组合(值,空)保存四个文件。所以 file1 由列性别、国家的 (value,value) 组成。 file2 由 (value,null) 组成,用于列性别、国家。 file3 由 (null,value) 和 file4 组成 (null,null)。

我搜索了很多东西,但找不到任何有用的信息。我也试过下面的

val df1 = data.withColumn("combination",concat(col("sex") ,lit(","), col("country")))
df1.coalesce(1).write.partitionBy("combination").format("csv").option("header", "true").mode("overwrite").save("text.csv")

但我收到更多文件,因为此命令会根据(性别国家)的所有可能数据生成文件。 与下面相同

val df1 = data.withColumn("combination",concat(col("sex")))
    df1.coalesce(1).write.partitionBy("combination").format("csv").option("header", "true").mode("overwrite").save("text.csv")

是否有任何类似于 partitionby 的命令,可以为我提供对 (value,null) 的组合而不是列的组合?

【问题讨论】:

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


    【解决方案1】:

    您可以将列转换为布尔值,具体取决于它们是否为空,并连接成一个字符串,看起来像“true_true”、“true_false”等。

    df = df.withColumn("coltype", concat(col("sex").isNull(), lit("_"), col("country").isNull()))
    df.coalesce(1)
      .write
      .partitionBy("coltype")
      .format("csv")
      .option("header", "true")
      .mode("overwrite")
      .save("output")
    

    【讨论】:

    • 非常感谢您的评论。它有很大帮助。 :D
    猜你喜欢
    • 2017-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 2021-10-02
    • 1970-01-01
    相关资源
    最近更新 更多