Ringkasan

File Data Terstruktur (SDF) adalah nilai yang dipisahkan koma (CSV) yang diformat secara khusus file yang digunakan untuk mengambil dan memperbarui data Display & Referensi Video 360 dalam dalam jumlah besar. Melalui Display & Video 360 API, Anda dapat membuat dan mendownload SDF yang disesuaikan, yang memungkinkan Anda mengambil data yang teratur dan difilter di kampanye Display & Video 360 Google Cloud Platform.

Panduan ini menjelaskan cara membuat operasi Download SDF, melacak aktivitas tersebut operasi, dan mengunduh SDF yang dihasilkan.

Informasi mengenai format dan pembuatan versi SDF dapat ditemukan di Dokumentasi referensi SDF.

Membuat tugas

SDF dihasilkan oleh operasi asinkron, yang disebut sdfdownloadtask. Saat membuat tugas ini, Anda harus menentukan parameter terkait SDF yang diinginkan. Hal ini dilakukan melalui metode sdfdownloadtasks.create. Tujuan subbagian berikut menjelaskan parameter yang dapat Anda tetapkan.

Menentukan versi

Format File Data Terstruktur diperbarui secara rutin secara terpisah dari Layar & Video 360 API, dengan versi baru yang dirilis dan versi lama tidak digunakan lagi secara rutin. Untuk alasan ini, selalu disarankan agar pengguna menggunakan versi SDF terbaru.

Anda menyetel versi SDF dari SDF yang diinginkan menggunakan Kolom version dalam isi permintaan. Jika tidak ditetapkan atau ditetapkan ke SDF_VERSION_UNSPECIFIED, tugas akan menggunakan versi SDF default dari pengiklan atau partner yang digunakan sebagai konteks konten SDF.

Menetapkan konteks

Anda dapat membuat SDF yang berisi data pada sumber daya apa pun yang tersedia, tetapi setiap SDF hanya dapat mengembalikan konten dalam konteks satu partner atau pengiklan. Konteks ini didefinisikan dalam isi permintaan oleh partnerId atau Kolom advertiserId. Tepat satu dari dua ini harus ditetapkan.

Hanya resource dalam konteks yang diberikan yang akan disertakan dalam SDF yang dihasilkan. Jika Anda mencoba memfilter menurut resource yang tidak dimiliki oleh partner yang ditentukan atau pengiklan, baik produk itu maupun konten di bawahnya tidak akan disertakan dalam hasil pengujian tersebut. Jika hanya memfilter berdasarkan resource yang tidak disertakan ini, file yang dihasilkan akan kosong. Mencoba memfilter menurut resource di luar konteks yang ditentukan tidak akan menampilkan error, jadi pastikan untuk memeriksa bahwa konteks Anda sudah sesuai benar.

Pilih filter yang tepat

Selain konteks yang ditetapkan di atas, Anda dapat memfilter lebih lanjut cakupan membuat File Data Terstruktur dengan menentukan jenis file yang ingin Anda dihasilkan dan sumber daya tertentu atau kelompok sumber daya yang ingin Anda sertakan.

Ada tiga filter yang tersedia untuk sdfdownloadtask, masing-masing melayani jenis spesifikasi tertentu. Anda hanya dapat menetapkan satu untuk satu sdfdownloadtask.

ParentEntityFilter

ParentEntityFilter adalah yang paling luas dari filter.

Dengan menggunakan kolom fileType, Anda dapat mencantumkan semua hal yang diinginkan jenis file yang ingin dibuat dengan tugas Anda. Ini adalah diperlukan, dan jika dibiarkan kosong atau ditetapkan ke FILE_TYPE_UNSPECIFIED, sdfdownloadtask akan selesai tanpa error.

Menggunakan filterType dan Kolom filterIds, Anda dapat menyaring hasil lebih lanjut. filterType menentukan jenis resource untuk memfilter dan filterIds mengidentifikasi resource berdasarkan ID uniknya. SDF yang dihasilkan akan mencakup resource yang diidentifikasi oleh fileType yang sumber daya atau turunan dari sumber daya yang diidentifikasi oleh filterType dan filterIds.

IdFilter

IdFilter memfilter permintaan Anda agar hanya menyertakan resource teridentifikasi.

IdFilter memiliki kolom untuk setiap jenis SDF, tidak termasuk Inventaris Sumber. Setiap {i>field<i} ini adalah daftar ID unik yang mengidentifikasi sumber daya tertentu yang ingin Anda sertakan dalam SDF yang dihasilkan. ID yang diberikan harus berada dalam konteks yang ditetapkan, tetapi mereka tidak harus berkaitan langsung. Anda tidak perlu meminta kampanye tertentu untuk meminta kampanye item baris termuat, dan sebaliknya. Satu-satunya jenis file yang dibuat adalah jenis sesuai dengan referensi yang diidentifikasi di IdFilter.

InventorySourceFilter

InventorySourceFilter hanya memungkinkan pemfilteran dan mendownload SDF yang berisi resource Sumber Inventaris. Ini adalah satu-satunya yang dapat Anda gunakan untuk mendapatkan informasi tentang sumber daya Sumber Inventaris.

InventorySourceFilter memiliki bentuk tunggal Kolom inventorySourceIds tempat Anda mengidentifikasi ID resource sumber inventaris yang ingin Anda sertakan dalam SDF. Jika daftar yang diberikan ke inventorySourceIds kosong, semua sumber inventaris berdasarkan konteks yang ditetapkan akan disertakan dalam SDF yang dibuat.

Buat permintaan

Setelah mengetahui parameter SDF yang diinginkan, Anda dapat membuat permintaan dan membuat sdfdownloadtask.

Berikut contoh cara membuat sdfdownloadtask menggunakan ParentEntityFilter:

Java

// Create the filter structure
ParentEntityFilter parentEntityFilter = new ParentEntityFilter();
parentEntityFilter.setFileType(sdf-file-type-list);
parentEntityFilter.setFilterType(sdfFilterType);
parentEntityFilter.setFilterIds(filter-id-list);

// Configure the sdfdownloadtasks.create request
Sdfdownloadtasks.Create request =
   service
       .sdfdownloadtasks()
       .create(
           new CreateSdfDownloadTaskRequest()
               .setVersion(sdfVersion)
               .setAdvertiserId(advertiserId)
               .setParentEntityFilter(parentEntityFilter)
       );

// Create the sdfdownloadtask
Operation operationResponse = request.execute();

System.out.printf("Operation %s was created.\n",
   operationResponse.getName());

Python

# Configure the sdfdownloadtasks.create request
createSdfDownloadTaskRequest = {
    'version': sdf-version,
    'advertiserId': advertiser-id,
    'parentEntityFilter': {
        'fileType': sdf-file-type-list,
        'filterType': sdf-filter-type,
        'filterIds': filter-id-list
    }
}

# Create the sdfdownloadtask
operation = service.sdfdownloadtasks().create(
    body=createSdfDownloadTaskRequest).execute();

print("Operation %s was created." % operation["name"])

PHP

// Create the sdfdownloadtasks.create request structure
$createSdfDownloadTaskRequest =
    new Google_Service_DisplayVideo_CreateSdfDownloadTaskRequest();
$createSdfDownloadTaskRequest->setAdvertiserId(advertiser-id);
$createSdfDownloadTaskRequest->setVersion(sdf-version);

// Create and set the parent entity filter
$parentEntityFilter = new Google_Service_DisplayVideo_ParentEntityFilter();
$parentEntityFilter->setFileType(sdf-file-type-list);
$parentEntityFilter->setFilterType(sdf-filter-type);
if (!empty(filter-id-list)) {
    $parentEntityFilter->setFilterIds(filter-id-list);
}
$createSdfDownloadTaskRequest->setParentEntityFilter($parentEntityFilter);

// Call the API, creating the SDF Download Task.
$operation = $this->service->sdfdownloadtasks->create(
    $createSdfDownloadTaskRequest
);

printf('Operation %s was created.\n', $operation->getName());

Memeriksa permintaan dan mendapatkan jalur download

Saat Anda membuat sdfdownloadtask, objek operation akan dikembalikan. Operasi ini merepresentasikan status SDF asinkron Anda pada saat pembuatan. Anda dapat memeriksa operasi Anda untuk melihat apakah paket telah selesai dan siap diunduh, atau menampilkan pesan {i>error<i}, menggunakan metode sdfdownloadtasks.operations.get.

Setelah selesai, operasi yang dikembalikan akan memiliki nilai {i>non-null<i} Kolom done. Operasi yang sudah selesai akan mencakup response atau error kolom tersebut. Jika ada, kolom error akan memiliki Objek Status yang berisi kode error dan pesan, yang memberikan detail error yang terjadi. Jika ada kolom response, akan memiliki objek dengan nilai resourceName yang mengidentifikasi objek yang dibuat untuk diunduh.

Berikut adalah contoh cara memeriksa permintaan menggunakan backoff eksponensial:

Java

String operationName = operationResponse.getName();

// Configure the Operations.get request
Sdfdownloadtasks.Operations.Get operationRequest =
   service
       .sdfdownloadtasks()
       .operations()
       .get(operationName);

// Configure exponential backoff for checking the status of our operation
ExponentialBackOff backOff = new ExponentialBackOff.Builder()
   .setInitialIntervalMillis(5000) // setting initial interval to five seconds
   .setMaxIntervalMillis(300000)  // setting max interval to five minutes
   .setMaxElapsedTimeMillis(18000000) // setting max elapsed time to five hours
   .build();

while (operationResponse.getDone() == null) {
 long backoffMillis = backOff.nextBackOffMillis();
 if (backoffMillis == ExponentialBackOff.STOP) {
   System.out.printf("The operation has taken more than five hours to
       complete.\n");
   return;
 }
 Thread.sleep(backoffMillis);

 // Get current status of operation
 operationResponse = operationRequest.execute();
}

// Check if the operation finished with an error and return
if (operationResponse.getError() != null) {
 System.out.printf("The operation finished in error with code %s: %s\n",
     operationResponse.getError().getCode(), operationResponse.getError()
         .getMessage());
 return;
}

System.out.printf(
    "The operation completed successfully. Resource %s was created.\n",
    operationResponse.getResponse().get("resourceName").toString());

Python

# The following values control retry behavior while
# the report is processing.
# Minimum amount of time between polling requests. Defaults to 5 seconds.
min_retry_interval = 5
# Maximum amount of time between polling requests. Defaults to 5 minutes.
max_retry_interval = 5 * 60
# Maximum amount of time to spend polling. Defaults to 5 hours.
max_retry_elapsed_time = 5 * 60 * 60

# Configure the Operations.get request
get_request = service.sdfdownloadtasks().operations().get(
  name=operation["name"]
)

sleep = 0
start_time = time.time()
while True:
  # Get current status of operation
  operation = get_request.execute()

  if "done" in operation:
    if "error" in operation:
      print("The operation finished in error with code %s: %s" % (
            operation["error"]["code"],
            operation["error"]["message"]))
    else:
      print("The operation completed successfully. Resource %s was created."
            % operation["response"]["resourceName"])
    break
  elif time.time() - start_time > max_retry_elapsed_time:
    print("Generation deadline exceeded.")

  sleep = next_sleep_interval(sleep)
  print("Operation still running, sleeping for %d seconds." % sleep)
  time.sleep(sleep)

def next_sleep_interval(previous_sleep_interval):
  """Calculates the next sleep interval based on the previous."""
  min_interval = previous_sleep_interval or min_retry_interval
  max_interval = previous_sleep_interval * 3 or min_retry_interval
  return min(max_retry_interval, random.randint(min_interval, max_interval))

PHP

// The following values control retry behavior
// while the task is processing.
// Minimum amount of time between polling requests. Defaults to 5 seconds.
$minRetryInterval = 5;
// Maximum amount of time between polling requests. Defaults to 5 minutes.
$maxRetryInterval = 300;
// Maximum amount of time to spend polling. Defaults to 5 hours.
$maxRetryElapsedTime = 18000;

$operationName = $operation->getName();

$sleepInterval = 0;
$startTime = time();

while (!$operation->getDone()) {
    if ($sleepInterval != 0) {
        printf(
            'The operation is still running, sleeping for %d seconds\n',
            $sleepInterval
        );
    }

    // Sleep before retrieving the SDF Download Task again.
    sleep($sleepInterval);

    // Call the API, retrieving the SDF Download Task.
    $operation = $this->service->sdfdownloadtasks_operations->get(
        $operation->getName()
    );

    // If the operation has exceeded the set deadline, throw an exception.
    if (time() - $startTime > $maxRetryElapsedTime) {
        printf('SDF download task processing deadline exceeded\n');
        throw new Exception(
            'Long-running operation processing deadline exceeded'
        );
    }

    // Generate the next sleep interval using exponential backoff logic.
    $sleepInterval = min(
        $maxRetryInterval,
        rand(
            max($minRetryInterval, $previousSleepInterval),
            max($minRetryInterval, $previousSleepInterval * 3)
        )
    );
}

// If the operation finished with an error, throw an exception.
if($operation->getError() !== null) {
    $error = $operation->getError();
    printf(
        'The operation finished in error with code %s: %s\n',
        $error->getCode(),
        $error->getMessage()
    );
    throw new Exception($error->getMessage());
}

// Print successfully generated resource.
$response = $operation->getResponse();
printf(
    'The operation completed successfully. Resource %s was '
        . 'created. Ready to download.\n',
    $response['resourceName']
);