我正在尝试使用Hadoop 2.7上的Spark 2.1.1将数据从Cassandra提取到特定的分区Hive表中。为此,我将来自Cassandra的所有数据转换为rdd,我通过rdd.toDF()转换为数据帧,并传递给以下函数:
public def writeToHive(ss: SparkSession, df: DataFrame) {
df.createOrReplaceTempView(tablename)
val cols = df.columns
val schema = df.schema
// logs 358
LOG.info(s"""SELECT COUNT(*) FROM ${tablename}""")
val outdf = ss.sql(s"""INSERT INTO TABLE ${db}.${t} PARTITION (date="${destPartition}") SELECT * FROM ${tablename}""")
// Have also tried the following lines below, but yielded the same results
// var dfInput_1 = dfInput.withColumn("region", lit(s"${destPartition}"))
// dfInput_1.write.mode("append").insertInto(s"${db}.${t}")
// logs 358
LOG.info(s"""SELECT COUNT(*) FROM ${tablename}""")
// logs 423
LOG.info(s"""SELECT COUNT(*) FROM ${db}.${t} where date='${destPartition}'""")
}
在查看Cassandra时,表中确实有358行。我在Hortonworks https://community.hortonworks.com/questions/51322/count-msmatch-while-using-the-parquet-file-in-spar.html上看过这篇文章,但似乎并不是一个解决方案。我已经尝试将spark.sql.hive.metastorePartitionPruning设置为true,但是没有在行计数中看到任何更改。
非常喜欢有关为什么行数之间存在差异的任何反馈。谢谢!
编辑:糟糕的数据进入......应该会看到即将到来的
答案 0 :(得分:0)
有时数据包含非utf8字符,如日语或中文。检查数据是否包含任何此类非utf8字符。
如果是这种情况,请以ORC格式插入。默认情况下,它是文本,文本不支持非utf8字符。