Azure 将数据从blob存储复制到sqlDatabase(复制到多个表中)

Azure 将数据从blob存储复制到sqlDatabase(复制到多个表中),azure,azure-data-factory,Azure,Azure Data Factory,我对azure比较陌生,我发现自己被卡住了!我正在尝试使用Azure DataFactory将blob存储中的数据读取到SQL数据库中。我使用复制活动使这个过程正常工作,现在我正尝试将数据插入到多个以某种方式相互关联的表中(privateKey、foreignKey)例如,要更新表CAR,我需要知道表owner中是否存在所有者。我也找不到一个详细的解释如何去做!有没有经验的人能给我一些指导?谢谢您需要使用映射数据流执行联接或查找,然后使用条件拆分转换将行重定向到相应的数据库表。根据我的理解,您需

我对azure比较陌生,我发现自己被卡住了!我正在尝试使用Azure DataFactory将blob存储中的数据读取到SQL数据库中。我使用复制活动使这个过程正常工作,现在我正尝试将数据插入到多个以某种方式相互关联的表中(privateKey、foreignKey)例如,要更新表CAR,我需要知道表owner中是否存在所有者。我也找不到一个详细的解释如何去做!有没有经验的人能给我一些指导?谢谢

您需要使用映射数据流执行联接或查找,然后使用条件拆分转换将行重定向到相应的数据库表。

根据我的理解,您需要使用查找活动获取表名,然后使用forEach活动遍历表,然后使用映射数据流或数据块来应用过滤器和连接

我可以添加到Shivar所呼吁的内容中。我们将不得不使用查找活动,但在处理CAR表之前,您应该确保首先复制表“所有者”,为此,您应该在foreach活动中启用sequential选项,以便按照顺序进行操作,否则将出现大量FK冲突错误

我会采取不同的方法来解决这个问题。使用下面的代码,我们可以将多个文件中的数据合并到一个数据框中,所有文件都具有相似的名称,并将整个过程推送到SQL Server中。这是Scala,因此需要在Azure Databricks环境中运行

# merge files with similar names into a single dataframe
val DF = spark.read.format("csv")
   .option("sep","|")
   .option("inferSchema","true")
   .option("header","false")
   .load("mnt/rawdata/corp/ABC*.gz")


DF.count()


# rename headers in dataframe
val newNames = Seq("ID", "FName", "LName", "Address", "ZipCode", "file_name")
val dfRenamed = df.toDF(newNames: _*)

dfRenamed.printSchema


# push the dataframe to sql server
import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._

// Aquire a DataFrame collection (val collection)

val config = Config(Map(
  "url"            -> "my_sql_server.database.windows.net",
  "databaseName"   -> "my_db_name",
  "dbTable"        -> "dbo.my_table",
  "user"           -> "xxxxx",
  "password"       -> "xxxxx",
  "connectTimeout" -> "5", //seconds
  "queryTimeout"   -> "5"  //seconds
))

import org.apache.spark.sql.SaveMode
DF.write.mode(SaveMode.Append).sqlDB(config)
上面的代码将读取每个文件的每一行。如果标题在第一行中,这非常有效。如果标题不在第一行中,请使用下面的代码包装一个特定的模式,然后再次读取每个文件的每一行

import org.apache.spark.sql.SQLContext
import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType};
import org.apache.spark.sql.functions.input_file_name

val customSchema = StructType(Array(
    StructField("field1", StringType, true),
    StructField("field2", StringType, true),
    StructField("field3", StringType, true),
    StructField("field4", StringType, true),
    StructField("field5", StringType, true),
    StructField("field6", StringType, true),
    StructField("field7", StringType, true)))

val df = sqlContext.read
    .format("com.databricks.spark.csv")
    .option("header", "false")
    .option("sep", "|")
    .schema(customSchema)
    .load("mnt/rawdata/corp/ABC*.gz")
    .withColumn("file_name", input_file_name())


import com.microsoft.azure.sqldb.spark.bulkcopy.BulkCopyMetadata
import com.microsoft.azure.sqldb.spark.config.Config
import com.microsoft.azure.sqldb.spark.connect._



val bulkCopyConfig = Config(Map(
  "url"               -> "mysqlserver.database.windows.net",
  "databaseName"      -> "MyDatabase",
  "user"              -> "username",
  "password"          -> "*********",
  "databaseName"      -> "MyDatabase",
  "dbTable"           -> "dbo.Clients",
  "bulkCopyBatchSize" -> "2500",
  "bulkCopyTableLock" -> "true",
  "bulkCopyTimeout"   -> "600"
))

df.write.mode(SaveMode.Append).
//df.bulkCopyToSqlDB(bulkCopyConfig, bulkCopyMetadata)
//df.bulkCopyToSqlDB(bulkCopyConfig) if no metadata is specified.

您是否考虑过使用存储过程?