我对天青还比较陌生,我发现自己被卡住了!我正在尝试使用Azure DataFactory将Blob存储中的数据读取到SQL数据库中。我使用复制活动使此过程能够正常工作,现在我试图将数据插入彼此相关的多个表中(privateKey,foreignKey)。 例如,要更新表CAR,我需要知道表所有者中是否存在所有者。我无法找到有关该操作的详细说明!有经验的人可以给我一些指导吗?谢谢
答案 0 :(得分:0)
您将需要使用“映射数据流”执行联接或查找,然后使用“条件拆分”转换将行重定向到适当的数据库表。
答案 1 :(得分:0)
根据我的理解,您需要使用查找活动来获取表名,然后使用forEach活动来遍历表,然后使用Mapping数据流或Databricks来应用过滤器和联接
答案 2 :(得分:0)
我可以补充Shivar所说的内容。我们将必须使用lookup活动,但是在使用CAR表之前,应确保首先复制了“所有者”表,为此,您应在foreach活动中启用顺序选项,以便遵循顺序,否则会出现很多FK违规错误。
答案 3 :(得分:0)
我将采用其他方法来解决此问题。使用下面的代码,我们可以将多个具有相似名称的文件中的数据合并到一个数据框中,并将整个内容推送到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.