转换spark数据集中的数据时数据类型不匹配

时间:2017-04-12 07:29:01

标签: java apache-spark apache-spark-sql parquet apache-spark-dataset

我使用spark:

从csv文件创建了一个镶木地板结构
Dataset<Row> df = park.read().format("com.databricks.spark.csv").option("inferSchema", "true")
            .option("header", "true").load("sample.csv");
df.write().parquet("sample.parquet");

我正在阅读镶木地板结构,我试图转换数据集中的数据:

Dataset<org.apache.spark.sql.Row> df = spark.read().parquet("sample.parquet");
df.createOrReplaceTempView("tmpview");
Dataset<Row> namesDF = spark.sql("SELECT *, md5(station_id) as hashkey FROM tmpview");

不幸的是我收到了数据类型不匹配错误。我是否必须明确指定数据类型?

  

17/04/12 09:21:52 INFO SparkSqlParser:解析命令:SELECT *,   md5(station_id)作为hashkey FROM tmpview线程中的异常&#34; main&#34;   org.apache.spark.sql.AnalysisException:无法解决   &#39; MD5(tmpview station_id。)&#39;由于数据类型不匹配:参数1   但是,需要二进制类型,&nbsp; tmpview。station_id&#39;是int类型。;   第1行pos 10; &#39;项目[station_id#0,bikes_available#1,   docks_available#2,time#3,md5(station_id#0)AS hashkey#16]   + - SubqueryAlias tmpview,tmpview + - 关系[station_id#0,bikes_available#1,docks_available#2,time#3]   镶木

2 个答案:

答案 0 :(得分:1)

是的,根据Spark documentationmd5函数仅适用于binary(文本/字符串)列,因此您需要将station_id投射到string在应用md5之前。在Spark SQL中,您可以将md5cast链接在一起,例如:

Dataset<Row> namesDF = spark.sql("SELECT *, md5(cast(station_id as string)) as hashkey FROM tmpview");

或者您可以在数据框架中创建新列并在其上应用md5,例如:

val newDf = df.withColumn("station_id_str", df.col("station_id").cast(StringType))
newDf.createOrReplaceTempView("tmpview");
Dataset<Row> namesDF = spark.sql("SELECT *, md5(station_id_str) as hashkey FROM tmpview");

答案 1 :(得分:0)

如果您在 Databricks(Azure Databricks Notebooks)上遇到此错误 以下代码段在 3.x 集群上运行可能对您有用。

md5(cast(concat_ws('some string' + 'some string') + """)as BINARY))