Spark SQL - 无法将所有记录写入配置单元表
Posted
技术标签:
【中文标题】Spark SQL - 无法将所有记录写入配置单元表【英文标题】:Spark SQL - Can not write all records to the hive table 【发布时间】:2021-03-12 23:33:00 【问题描述】:我是 Apache Spark 框架的新手,我正在使用 ApacheSpark 通过 Hive 将数据写入 Hadoop。
在下面的代码中,我从 hive 中读取 table_1 并创建数据集,然后将此数据集映射到另一个数据集。毕竟将结果数据集保存到另一个 table_2。
public static void main(String[] args)
Dataset<Row> ipSet = spark.sql("Select distinct ip from table_1");
ipSet.map(new TestFunction(), Encoders.bean(MyPojoClass.class)).write().mode("append").insertInto("table_2");
// ...
public class TestFunction implements MapFunction<Row, MyPojoClass>
private static List<..> staticData;
private static boolean callOnce = false;
private static void initStaticData() throws IOException
staticData = // set the data,
callOnce = true;
@Override
public MyPojoClass call(Row value) throws Exception
if (!calledOnce)
initStaticData();
String ip = value.getAs("ip");
return new MyPojoClass(ip);
两个不同表中的行数应该相同,但是结果数据集/table_2中的行数不同。
例如,table_1 有 9.000.000 个不同的行,而 table_2 有 42.000 个不同的行。我该如何解决这个问题? (或者我错过了一些关于火花的概念?)
【问题讨论】:
您正在以不同的方式读取整个 table_1,因此您只在 table_2 中写入不同的值。同样在附加模式下,因此如果 table_2 中已经存在任何先前的值,则将被保留。他们都应该有相同的行数似乎很奇怪 @SCouto 9.000.000 是不同的数字。因此 table_2 必须有 9.000.000 个不同的行! 我对 Spark 和 Java 不太熟练,但对我来说似乎是对的。也许问题是表的元数据没有更新?执行插入后尝试在 table_2 上运行 MSCK 修复表,然后再次检查 【参考方案1】:我过去也遇到过类似的问题。
主要是spark SQL row函数getAs
.
GetAsAPI getAs(字符串字段名) 返回给定 fieldName 的值。对于原始类型,如果值为 null,则返回特定于原始类型的“零值”,即。 0 表示 Int。
因此,您的 IP 地址可能在大多数情况下为空,而其他数据的行为可能与代码中“ip”的空值或 0 值相同。
【讨论】:
以上是关于Spark SQL - 无法将所有记录写入配置单元表的主要内容,如果未能解决你的问题,请参考以下文章
Spark SQL 2.1 是不是支持将临时表或配置单元表写入 Mysql/Oracle?
Spark - 如何将约 20TB 的数据从 DataFrame 写入配置单元表或 hdfs?