【问题标题】:Can I change the datatype of the Spark dataframe columns that is being loaded to SQL Server as a table?我可以更改作为表加载到 SQL Server 的 Spark 数据框列的数据类型吗?
【发布时间】:2019-01-15 01:06:16
【问题描述】:

我正在尝试使用以下 Pyspark 代码从 Azure Data Lake 读取 Parquet 文件。

df= sqlContext.read.format("parquet")
   .option("header", "true")
   .option("inferSchema", "true")
   .load("adl://xyz/abc.parquet")
df = df['Id','IsDeleted']

现在我想使用以下代码将此数据帧 df 作为表加载到 sql 数据仓库中:

df.write \
  .format("com.databricks.spark.sqldw") \
  .mode('overwrite') \
  .option("url", sqlDwUrlSmall) \
  .option("forward_spark_azure_storage_credentials", "true") \
  .option("dbtable", "test111") \
  .option("tempdir", tempDir) \
  .save()

这将在 SQL 数据仓库中创建一个表 dbo.test111,其数据类型为:

  • Id(nvarchar(256),null)
  • IsDeleted(bit,null)

但我需要这些具有不同数据类型的列,例如 SQL 数据仓库中的 char(255)、varchar(128)。在将数据帧加载到 SQL Dataware house 时如何执行此操作?

【问题讨论】:

    标签: sql-server pyspark azure-data-lake azure-sql-data-warehouse


    【解决方案1】:

    我找到了一种方法可以帮助你修改列数据类型,但可能无法实现你想要的。

    df.select(col("colname").cast(DataType))
    

    这里有一个关于How to change column types in Spark SQL's DataFrame 的信息。

    也许这对你有帮助。

    【讨论】:

      【解决方案2】:

      给出了 Spark SQL 上唯一支持的数据类型 [https://spark.apache.org/docs/1.6.0/api/java/org/apache/spark/sql/types/package-summary.html][1]

      字符串类型实际上会被转换为VARCHAR,长度未指定。 Spark SQL 没有VARCHAR(n) 数据类型。

      您应该能够执行以下操作

      import org.apache.spark.sql.types._
      
      val df = 
                df.withColumn("Id_mod", df.Id.cast(StringType)) 
                  .withColumn("IsDeleted_mod", df.IsDeleted.cast(StringType))
                  .drop("Id")
                  .drop("IsDeleted")
                  .withColumnRenamed("Id_mod", "Id")
                  .withColumnRenamed("IsDeleted_mod", "IsDeleted")
                  //Replace StringType with Any supported desired type
      

      【讨论】:

      • 我可以使用 .format("jdbc")\。选项(“createTableColumnTypes”,“Id varchar(64)”)。但问题是我需要一个在 SQL DW 中具有 nvarchar 数据类型的列,而不是 varchar() ,这是无法完成的。看起来它只支持少数数据类型。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-17
      • 1970-01-01
      • 2011-09-11
      • 1970-01-01
      • 1970-01-01
      • 2016-10-22
      相关资源
      最近更新 更多