PHP-пакет S эквивалентен в c # [дубликат]

С искрами 2.2.0 проблема была исправлена ​​для меня, добавив дополнительную информацию о пути пути для сеанса SparkSession в скрипте python:

    spark = SparkSession \
        .builder \
        .appName("Python Spark SQL basic example") \
        .config("spark.driver.extraClassPath", "/path/to/jdbc/driver/postgresql-42.1.4.jar") \
        .getOrCreate()

См. официальную документацию https: //spark.apache .org / docs / latest / configuration.html

В моем случае искра не запускается из команды cli, а из django framework https://www.djangoproject.com/

0
задан Kev 30 October 2009 в 02:06
поделиться

2 ответа

Похоже, что для вашего запроса требуется строка с префиксом длины, состоящая из однобайтных символов, поэтому в C # потребуется немного больше работы, которая использует символы Unicode. Я собираюсь предположить, что вы хотите, чтобы ваша строка XML была закодирована с помощью UTF-8. Мы также не сможем использовать строку, чтобы удерживать запрос, когда он был скомпоновано, вместо этого мы будем использовать массив байтов.

using System;
using System.IO;
using System.Text;

class Program
{
    static void
    Main(string[] args)
    {
        string xml = "<xml><request>...[snipped for brevity]...</request></xml>";
        using ( MemoryStream stream = new MemoryStream() )
        {
            using ( BinaryWriter writer = new BinaryWriter(stream) )
            {
                byte [] encodedXml = Encoding.UTF8.GetBytes(xml);
                writer.Write(ToBigEndian(encodedXml.Length + 4));
                writer.Write(encodedXml);
            }

            byte [] request = stream.ToArray();

            //  now use request however you like
        }
    }

    static byte []
    ToBigEndian(int value)
    {
        byte [] retval = BitConverter.GetBytes(value);
        if ( BitConverter.IsLittleEndian )
        {
            Array.Reverse(retval);
        }
        return retval;
    }
}

. Другое замечание заключается в том, что php pack () с параметром «N» заставляет big-endian на ваших ведущих 4 байтах. Поэтому я написал метод ToBigEndian () для обработки преобразования в big-endian на любой платформе.

1
ответ дан GBegen 25 August 2018 в 19:43
поделиться
  • 1
    Работает с удовольствием, я забыл о том, что строки C # являются юникодом. Благодарю. – Kev 30 October 2009 в 02:48

System.IO.BinaryWriter окажется более близким.

Я не PHP-гуру (не использовал его в годах), но следующие вероятно, довольно близки по функциональности:

using System.IO;
using System.Text;

string xml = "the original data to pack";
using (MemoryStream ms = new MemoryStream())
{
  using (BinaryWriter bw = new BinaryWriter(ms))
  {
    byte[] data = Encodings.ASCII.GetBytes(xml);
    bw.Write((Int32)data.Length + 4); // Size of ASCII string + length (4 byte int)
    bw.Write(data);
  }

  request = ms.ToArray();
}
1
ответ дан Christopher Fairbairn 25 August 2018 в 19:43
поделиться
  • 1
    Вы также можете изучить класс BitConverter. – Christopher Fairbairn 30 October 2009 в 02:24
  • 2
    Спасибо за ответ Кристофер, я пошел с методом BitConverter после некоторого рытья. Но все равно. – Kev 30 October 2009 в 02:29
Другие вопросы по тегам:

Похожие вопросы: