Я просто столкнулся с той же проблемой, но оказалось, что pip install pyspark
загружает искровую разрядку, которая хорошо работает в локальном режиме. Пип просто не подходит SPARK_HOME
. Но когда я устанавливаю это вручную, pyspark работает как шарм (без загрузки каких-либо дополнительных пакетов).
$ pip3 install --user pyspark
Collecting pyspark
Downloading pyspark-2.3.0.tar.gz (211.9MB)
100% |████████████████████████████████| 211.9MB 9.4kB/s
Collecting py4j==0.10.6 (from pyspark)
Downloading py4j-0.10.6-py2.py3-none-any.whl (189kB)
100% |████████████████████████████████| 194kB 3.9MB/s
Building wheels for collected packages: pyspark
Running setup.py bdist_wheel for pyspark ... done
Stored in directory: /home/mario/.cache/pip/wheels/4f/39/ba/b4cb0280c568ed31b63dcfa0c6275f2ffe225eeff95ba198d6
Successfully built pyspark
Installing collected packages: py4j, pyspark
Successfully installed py4j-0.10.6 pyspark-2.3.0
$ PYSPARK_PYTHON=python3 SPARK_HOME=~/.local/lib/python3.5/site-packages/pyspark pyspark
Python 3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
2018-03-31 14:02:39 WARN NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
____ __
/ __/__ ___ _____/ /__
_\ \/ _ \/ _ `/ __/ '_/
/__ / .__/\_,_/_/ /_/\_\ version 2.3.0
/_/
Using Python version 3.5.2 (default, Nov 23 2017 16:37:01)
>>>
Надеюсь, что помогает: -)
Без ваших фактических данных или источника нам будет сложно диагностировать, что происходит неправильно. Тем не менее, я могу сделать несколько советов:
Учитывая то, что вы написали, я подозреваю, что все преобразования данных базы данных в XML нарушены; он распространяет не-XML-символы.
Создайте несколько записей базы данных с не-XML-символами (NUL, DEL, управляющие символы и т. д.) и запустите на нем свой XML-конвертер. Выведите XML в файл и посмотрите на него в шестнадцатеричном редакторе. Если это содержит символы, отличные от XML, ваш конвертер не работает. Исправьте его или, если вы не можете, создадите препроцессор, который отклоняет вывод с такими символами.
Если вывод конвертера выглядит хорошо, проблема в вашем XML-потребителе; он где-то вставляет символы, отличные от XML. Вам придется разбить свой процесс потребления на отдельные этапы, изучить результат на каждом шаге и сузить, что представляет плохие символы.
Обновление: я просто натолкнулся на пример этого сам! Случилось то, что производитель кодировал XML как UTF16, и потребитель ожидал UTF8. Поскольку UTF16 использует 0x00 в качестве старшего байта для всех символов ASCII, а UTF8 - нет, потребитель просматривал каждый второй байт как NUL. В моем случае я мог бы изменить кодировку, но предложил, чтобы все полезные данные XML начинались с спецификации.
Я использую IronPython здесь (так же, как .NET API) и читаю файл как UTF-8, чтобы правильно обрабатывать спецификацию, исправил проблему для меня:
xmlFile = Path.Combine(directory_str, 'file.xml')
doc = XPathDocument(XmlTextReader(StreamReader(xmlFile.ToString(), Encoding.UTF8)))
Это сработало бы а также с XmlDocument
:
doc = XmlDocument()
doc.Load(XmlTextReader(StreamReader(xmlFile.ToString(), Encoding.UTF8)))
Я также получаю ту же ошибку в приложении ASP.NET, когда я сохранил некоторые данные Unicode (хинди) в файле Web.config и сохранил его с кодировкой «Unicode».
Он исправил ошибку для меня, когда я сохранил файл Web.config с кодировкой «UTF-8».
Чтобы добавить к ответу Зонца выше, после работы для нас.
//Instead of
XmlString.Replace("�", "[0x00]");
// use this
XmlString.Replace("\x00", "[0x00]");
В моем случае потребовалось некоторое копирование, но оно было найдено.
Мой контекст
Я просматриваю журналы ошибок / ошибок с веб-сайта, используя Elmah. Elmah возвращает состояние сервера в момент исключения, в виде большого XML-документа.
Во время атаки на веб-сайт я заметил, что некоторые xmls не анализируются и получают это исключение '.', hexadecimal value 0x00, is an invalid character.
.
НЕ РЕШЕНИЕ: я преобразовал документ в byte[]
и дезинфицировал его в 0x00, но не нашел его.
Когда я просматривал документ xml, я нашел следующее:
...
<form>
...
<item name="SomeField">
<value
string="C:\boot.ini�.htm" />
</item>
...
Был nul-байт, закодированный как объект html �
!!!
. РЕШЕНИЕ: Чтобы исправить кодировку, я заменил значение �
перед загрузкой в мой XmlDocument
, потому что при загрузке он создаст нулевой байт, и его будет трудно дезинфицировать от объекта. Вот мой весь процесс:
XmlDocument xml = new XmlDocument();
details.Xml = details.Xml.Replace("�", "[0x00]"); // in my case I want to see it, otherwise just replace with ""
xml.LoadXml(details.Xml);
string formattedXml = null;
// I have this in a helper function, but for this example I have put it in-line
StringBuilder sb = new StringBuilder();
XmlWriterSettings settings = new XmlWriterSettings {
OmitXmlDeclaration = true,
Indent = true,
IndentChars = "\t",
NewLineHandling = NewLineHandling.None,
};
using (XmlWriter writer = XmlWriter.Create(sb, settings)) {
xml.Save(writer);
formattedXml = sb.ToString();
}
LESSON LEARNED: санировать за незаконные байты с помощью связанного html-объекта, если ваши входящие данные кодируются html при записи.
В качестве своего рода позднего ответа:
У меня возникла проблема с SSRS ReportService2005.asmx при загрузке отчета.
Public Shared Sub CreateReport(ByVal strFileNameAndPath As String, ByVal strReportName As String, ByVal strReportingPath As String, Optional ByVal bOverwrite As Boolean = True)
Dim rs As SSRS_2005_Administration_WithFOA = New SSRS_2005_Administration_WithFOA
rs.Credentials = ReportingServiceInterface.GetMyCredentials(strCredentialsURL)
rs.Timeout = ReportingServiceInterface.iTimeout
rs.Url = ReportingServiceInterface.strReportingServiceURL
rs.UnsafeAuthenticatedConnectionSharing = True
Dim btBuffer As Byte() = Nothing
Dim rsWarnings As Warning() = Nothing
Try
Dim fstrStream As System.IO.FileStream = System.IO.File.OpenRead(strFileNameAndPath)
btBuffer = New Byte(fstrStream.Length - 1) {}
fstrStream.Read(btBuffer, 0, CInt(fstrStream.Length))
fstrStream.Close()
Catch ex As System.IO.IOException
Throw New Exception(ex.Message)
End Try
Try
rsWarnings = rs.CreateReport(strReportName, strReportingPath, bOverwrite, btBuffer, Nothing)
If Not (rsWarnings Is Nothing) Then
Dim warning As Warning
For Each warning In rsWarnings
Log(warning.Message)
Next warning
Else
Log("Report: {0} created successfully with no warnings", strReportName)
End If
Catch ex As System.Web.Services.Protocols.SoapException
Log(ex.Detail.InnerXml.ToString())
Catch ex As Exception
Log("Error at creating report. Invalid server name/timeout?" + vbCrLf + vbCrLf + "Error Description: " + vbCrLf + ex.Message)
Console.ReadKey()
System.Environment.Exit(1)
End Try
End Sub ' End Function CreateThisReport
Проблема возникает, когда вы выделяете байтовый массив, который по крайней мере на 1 байт больше, чем файл RDL (XML).
В частности, я использовал конвертер C # в vb.net, который преобразовал
btBuffer = new byte[fstrStream.Length];
в
btBuffer = New Byte(fstrStream.Length) {}
Но поскольку в C # число обозначает количество элементов в массиве, а в VB.NET это число обозначает UPPER BOUND массива, у меня был избыточный байт, вызывающий эту ошибку.
Таким образом, решение проблемы просто:
btBuffer = New Byte(fstrStream.Length - 1) {}